Я пытаюсь выяснить, как я могу переопределить значения по умолчанию для функций, определенных внутри некоторого модуля. Рассмотрим этот код (program.py
):как переопределить значения по умолчанию, необходимые функции в модуле?
# import the default & user defined settings
from default_settings import *
from my_settings import *
# import some functions, which might be dependent on the settings above
from functions import *
# call dummy_function from 'functions' - prints '1'
dummy_function()
# output SOME_DEFAULT - will be '1'
print SOME_DEFAULT
# re-import 'my_settings' - SOME_DEFAULT will now be '2'
from my_settings import *
print SOME_DEFAULT
здесь default_settings.py
:
DO_DEBUG = False
SOME_DEFAULT = 1
здесь my_settings.py
, кто значения я хотел бы использовать в functions.py
:
DO_DEBUG = True
SOME_DEFAULT = 2
Это functions.py
, где мне нужно импортировать default_settings
, иначе я получаю NameError. Я не хочу импортировать my_settings
здесь, потому что functions.py
должен больше напоминать общую библиотеку.
# if I leave this line out, then I get a
# "NameError: name 'SOME_DEFAULT' is not defined"
from default_settings import *
# I don't want to add "from my_settings import *" here, because 'functions.py'
# is supposed to be a generic library of functions.
# dummy decorator.
def do_profile(cond):
def resdec(f):
if cond:
print "profiling!"
return f
return resdec
# dummy function depending on both 'DO_DEBUG' and 'SOME_DEFAULT'
@do_profile(DO_DEBUG)
def dummy_function(bla=SOME_DEFAULT):
print bla
Если я бегу python program.py
я получаю следующий результат:
1
1
2
Это, как ожидается. Первый 1
происходит от dummy_function
, второй 1
происходит от импорта default_settings
внутри functions
, а 2
является результатом моего повторного импорта my_settings
.
Есть ли способ переопределить настройки по умолчанию, которые необходимы dummy_function
, просто используя my_settings
? Я думал об уходе из линии from default_settings import *
в functions
, но затем я столкнулся с NameError
. Есть ли способ импорта из functions
и в то же время передать все переменные в functions
?
Это сообщение может быть лучшим аргументом, который я когда-либо читал, никогда не используя 'from foo import *'. – geoffspear
Я использую 'from foo import *' или 'from foo import DO_DEBUG, SOME_DEFAULT', не имеет большого значения, не так ли? Я буду рад услышать от вас, как поступать по-другому. – memyself