2017-01-23 18 views
0

У меня есть программа, которая может быть запущена как модуль или как независимый файл, в котором ничего не нужно запускать.Как я могу избежать интерпретатора, проверяющего аргументы по умолчанию функции?

Когда он импортируется, он должен импортировать файл с именем globalSettings.py, который содержит строки, такие как import_location = /Users/Documents/etc, которые будут находиться в той же папке, что и он. Когда он запускается как __main__, ему это не понадобится.

Так, в начале моего кода, у меня есть следующие:

try: 
    import globalSettings 
except ImportError: 
    print("Being run as independent program") 

Какой штраф.

Когда я вызываю основную функцию, я передаю соответствующие настройки прямо на нее, если она выполняется независимо, и она имеет значения по умолчанию, которые будут использоваться при запуске в качестве внешнего модуля.

Это MCVE:

def test_func(foo, bar=globalSettings.import_location): 
    do stuff 

и я называю это так:

if __name__ == "__main__": 
    test_func(20, "Users/myname/testfolder/etc") 

И когда я импортировать его из других стран, как test_func(30), и он найдет bar от GlobalSettings. Однако, когда я запускаю его самостоятельно, то возникает ошибка:

Traceback (most recent call last): 

File "/Users/tomburrows/Dropbox/Python Programming/import_test.py", line 1, in <module> 
    def test_func(foo, bar=globalSettings.import_location): 
NameError: name 'globalSettings' is not defined 

Он никогда не будет нуждаться в GlobalSettings, потому что я всегда буду проходить бар в качестве аргумента, когда я называю его в качестве самостоятельной программы, то потребуется только его когда я запускаю его как импорт, когда я убеждаюсь, что он имеет файл globalSettings вместе с ним.

Есть ли в любом случае игнорировать ошибку, которую я получаю?

+0

В вашей программе может быть более одного 'if __name__ ==" __main __ ":', поэтому вы можете использовать его для определения функции по-другому. т. е. добавьте один из двух определений 'test_func()', который делает по умолчанию что-то другое (или не дает его вообще, если это имеет смысл) в соответствующем случае. – martineau

ответ

1

Условное определение имени (globalSettings), которое затем безоговорочно используется в вашем скрипте (в частности, определение функции), обязательно сбой.

Что вы можете сделать, это убедиться, что аргумент по умолчанию всегда существует, даже если возникает исключение:

try: 
    import globalSettings 
    import_location = globalSettings.import_location 
except ImportError: 
    print("Being run as independent program") 
    import_location = '' # or whatever else 

, а затем определить свою функцию, чтобы иметь import_location в качестве значения по умолчанию для bar.

+0

Спасибо, но если я импортирую много вещей из 'globalSettings', есть ли более быстрый способ сделать это? – tburrows13

+0

Я не уверен, что вы хотите сказать быстрее. Используете значения в 'globalSettings' как значение по умолчанию для многих аргументов в различных функциях? –

+0

Я имел в виду, что для каждой переменной в 'globalSettings' мне придется добавить 2 строки в мой код, что не является серьезной проблемой, но мне было интересно, был ли более короткий путь. Я использую только переменные в одной функции по умолчанию. – tburrows13

 Смежные вопросы

  • Нет связанных вопросов^_^