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

bog*_*dan 0 python python-module global-variables

模块的示例代码:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

import mymodule

mymodule.samevar = "default"
...
mymodule.myfunc(somevar = "a")
...
mymodule.myfunc()
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lli 5

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

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

def myfunc(somevar = None):
    if somevar is None:
        print globals().get('somevar')
    else:
        print somevar
Run Code Online (Sandbox Code Playgroud)

我也改名为你mufunc,myfunc因为这是它被称为的名称(尽管你假设的Supreme Architect似乎能够犯下令人难以置信的糟糕设计,也许他指出该功能可以通过与其不同的名称来调用用?定义似乎与系统名称冲突这个假设但已经非常可恶的家伙被认为是强加给你的! - ).