2011-01-21 1 views
1

У меня есть следующий рисунок:Использование переменной для импорта

databasename = "mydatabase" 
import databasefunctions 

и в databasefunctions у меня есть следующий метод.

def checkStatusOfDatabase(database=databasename): 

Я же получаю сообщение об ошибке сказав: NameError: имя «имя_базы_данных» не определен на линии, определяющей checkStatusOfDatabase.

Я мог бы просто переместить определение databasename внутри модуля databasefunctions, но это не подходит для моего дизайна. Как еще я могу достичь того, что имя базы данных, определенное в основном модуле, используется как значение по умолчанию в любых импортированных модулях.

+0

Из-за любопытства, почему вы не можете выполнить определение в модуле databasefunctions? – aodj

+0

Не точный дубликат, но это должно в какой-то мере ответить на ваш вопрос: http://stackoverflow.com/questions/67631/how-to-import-module-from-file-name – viraptor

+0

Я хотел бы иметь все значения параметров прямо в начале моего основного модуля (потому что я их сильно изменяю) и не скрываются в разных импортированных модулях. – David

ответ

4

Вы не можете (и не должны) это делать; это сделало бы невозможным просто импортировать databasefunctions без основного модуля. Тем не менее, вы можете реализовать по умолчанию, как это:

# databasefunctions 
DEFAULT_NAME = "" 
def checkStatusOfDatabase(database=DEFAULT_NAME): 

# main 
import databasefunctions 
databasefunctions.DEFAULT_NAME = "mydatabase" 
+0

Отличный ответ! Я могу принять его за 4 минуты (Stackoverflow, очевидно, не верит в быстрые правильные ответы !?). – David

+0

Могу ли я написать следующее в основном вместо: from databasefunctions import *, а затем по следующей строке: DEFAULT_NAME = "mydatabase" – David

+0

phihap: К сожалению, вы * можете * сделать это, написав 'из __main__ import databasename' в базе данных модуль. Но я абсолютно согласен с тем, что вы не должны *, а ваша альтернатива - это правильный путь. – slowdog

0

Вы можете использовать модуль

import __builtin__ 
__builtin__.foo = 'bar' 

__builtin__ Это будет доступен из всех других модулей, когда вы делаете подобный метод доступа. Вы можете использовать это и сделать это:

+2

Я хотел бы подчеркнуть, что пока это работает, это не очень мудро. – aodj

+0

Спасибо за ответ в любом случае. – David