【问题标题】:sys.argv in main() but referencing global var in a previous functionmain() 中的 sys.argv 但在前一个函数中引用了全局变量
【发布时间】:2019-08-03 16:26:43
【问题描述】:

试图找到一种解决 UnboundLocalError 的 Pythonic 方法。在这个示例文件中,我希望能够将函数导入另一个 python 脚本(所以我不能在main() 之前声明thisfile,flag1)。 string = 只是表明我想使用flag1 作为局部变量的一种方式。

什么是好的解决方法? (我宁愿不通过索引sys.argv[1] 来访问flag1。只是我的偏好。)

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()

【问题讨论】:

    标签: python function global main


    【解决方案1】:

    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()
    

    【讨论】:

      【解决方案2】:

      一种更简洁的方法是仅在需要的地方访问默认 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()
      

      【讨论】:

      • OP 说他想在别处导入函数,这对导入不起作用。
      【解决方案3】:

      您需要以某种方式传递变量。下面是一种方法,经过验证可以工作 (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)
      

      【讨论】:

        猜你喜欢
        • 2022-08-02
        • 2013-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-13
        • 1970-01-01
        • 1970-01-01
        • 2019-03-19
        相关资源
        最近更新 更多