sys.argv в main (), но ссылается на глобальный var в предыдущей функции - PullRequest
0 голосов
/ 13 марта 2019

Попытка найти питонский способ обхода ошибки UnboundLocalError.В этом примере файла я хочу иметь возможность импортировать функции в другой скрипт Python (поэтому я не могу объявить thisfile,flag1 до main()).string = - это просто способ показать, что я хочу использовать flag1 в качестве локальной переменной.

Какой хороший обходной путь?(Я бы предпочел не получать доступ к flag1 путем индексации sys.argv[1]. Просто мои предпочтения.)

def somefunction(flag1=flag1):
    string = "I just want to use the flag1 var (%(flag1)s)" % locals()
def main():
    somefunction()

if __name__ == '__main__':
    thisfile, flag1 = sys.argv
    main()

=====
OUT: UnboundLocalError: local variable 'flag1' referenced before assignment

ОБНОВЛЕНИЕ: Итак, я не сказал, что на самом деле я делаю в somefunction - там я создаю файл sbatch с общим каркасом и заполняю переменные, поэтому мне нужно, чтобы flag1 был локальным, и я бы не стал передавать его через кучу функций или создавать несколько строкесли возможно (так выглядит красивее).

def somefunction():
    sometext = gettext()
    firstvar  = getfirstvar()
    string = '''!/bin/bash
#SBATCH --flags

./some_program --generic-flag 18 --used-every-time /some/path \
--needed-var %(sometext)s --first-var %(firstvar)s \
--final-flag %(flag1)s
''' % locals()

def main():
    somefunction()

if __name__ == '__main__':
    thisfile, flag1 = sys.argv
    main()

Ответы [ 3 ]

0 голосов
/ 13 марта 2019

Более точный способ - получить доступ к значению по умолчанию flag1 только там, где это необходимо

def somefunction(flag1=None):
    if flag1 is None:
        flag1 = sys.argv[1]
    string = "I just want to use the flag1 var (%(flag1)s)" % locals()
0 голосов
/ 13 марта 2019

locals (). Update (), кажется, работает достаточно хорошо, и мне не нужно передавать var через кучу функций туда, где я на самом деле его использую.

Любые дальнейшие улучшения приветствуются.

def somefunction():
    locals().update({'thisfile':thisfile,'flag1':flag1})
    sometext = gettext()
    firstvar  = getfirstvar()
    string = '''!/bin/bash
#SBATCH --flags

./some_program --generic-flag 18 --used-every-time /some/path \
--needed-var %(sometext)s --first-var %(firstvar)s \
--script-used %(thisfile)s \
--final-flag %(flag1)s
''' % locals()

def main():
    somefunction()

if __name__ == '__main__':
    global thisfile,flag1
    thisfile, flag1 = sys.argv
    main()
0 голосов
/ 13 марта 2019

Вам нужно как-то передать переменную. Ниже приведен один из способов сделать это, проверено на работу (BSD).

def somefunction(flag1=""):
    string = "I just want to use the flag1 var (%s)" % flag1
    print(string)

def main(flag1=""):
    somefunction(flag1=flag1)

if __name__ == "__main__":
    import sys 
    thisfile, flag1 = sys.argv
    main(flag1)
...