如何在Python中使用具有相同名称的命名参数和全局变量?

时间:2010-08-10 17:10:05

标签: python global-variables python-module

模块的示例代码:

somevar = "a"

def myfunc(somevar = None):
    # need to access both somevars ???
    # ... if somevar was specified print it or use the global value
    pass

if __name__ == '__main__':
    somevar = "b" # this is just for fun here
    myfunc("c")
    myfunc() # should print "a" (the value of global variable)

使用相同名称至少有两个原因:教育(学习如何使用本地/全局)和模块中的用法。

假设此代码是您的模块的一部分:mymodule并且您希望执行以下操作:

import mymodule

mymodule.samevar = "default"
...
mymodule.myfunc(somevar = "a")
...
mymodule.myfunc()

正如您可以想象的,在此示例中进行了简化,假设somevar参数是许多可选参数之一,并且myfunc在很多地方都被调用。

4 个答案:

答案 0 :(得分:5)

到目前为止,正如其他答案所说,最好的方法是避免这种非常非常糟糕的设计:只是不要对两个不同的东西使用相同的名称!

如果你被锁定在这个可怕的设计中,可能是因为贵公司的Supreme Architect颁布了它并且它只是不可协商的(例如,有大量的客户代码依赖于全局和参数的名称),第一个您的业​​务目的是确保您的简历是最新的,在最好的打印机上打印,并开始与您的社交网络成员取得联系,以便在更合理的地方寻找工作;接下来,为了避免在找到更好的工作之前失去健康保险,请尝试

def myfunc(somevar = None):
    if somevar is None:
        print globals().get('somevar')
    else:
        print somevar

我还将您的mufunc重命名为myfunc,因为这是名称的名称(虽然假设设计极其糟糕,您的假设Supreme Architect似乎能够为了犯罪,也许他指定该函数被一个与其定义的名称不同的名称调用?似乎与系统名称冲突这个假设但已经非常可恶的人被认为是强制性的在你身上! - )。

答案 1 :(得分:1)

为什么局部变量必须与全局变量同名?重命名其中一个似乎是一个简单的解决方案。另一种选择是将全局变量作为参数传递,但这仍然只是为您提供一个不同的变量名来访问保存值。

答案 2 :(得分:0)

两种解决方案:

  1. 重命名变量,即somevar_
  2. 将全局移动到其他模块。您可以编写模块myappdefaults

    import myappdefaults
    print myappdefaults.somevar
    

答案 3 :(得分:0)

这是做事的正确方法。

somevar = "a"

def mufunc(_somevar = None):
    global somevar
    if _somevar:
        print _somevar
    else:
        print somevar

if __name__ == '__main__':
    global somevar
    somevar = "b"
    myfunc("c")
    myfunc() $ should print "c"