2010-08-10 133 views
0

示例代码从一个模块:如何在Python中使用具有相同名称的命名参数和全局变量?

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在许多地方被调用。

+1

您是否尝试过关键词'global'和'local'? – NickHalden 2010-08-10 17:13:15

+1

第二个电话应该真的打印“C”,还是应该是“a”? – theomega 2010-08-10 17:19:20

+0

@theomega:谢谢你的评论,我纠正了这个例子。 – bogdan 2010-08-11 09:33:46

回答

5

到目前为止,最好的方法,因为其他的答案说,就是要避免这种情况非常,非常糟糕的设计:只是不使用两个不同的东西一样的名字!

如果你被困在这个可怕的设计中,可能是因为你公司的最高架构师颁布了它,它只是不可协商的(例如,依赖于全局和参数名称的大量客户代码),为您的第一笔业务是确保您的简历是最新的,并将其打印在最佳打印机上,并开始与社交网络成员取得联系,以便在运行更加明智的地点找工作;接下来,以避免失去医疗保险,直到一个更好的工作中发现,尝试

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

我也改名为您到myfunc,因为这是它被名字叫用(尽管给出的非常糟糕的设计假想的最高法院建筑师似乎能犯下,也许他指定的功能,通过它与定义的一个不同的名称叫什么?好像去的系统名称冲突假设这个假设的,但已经相当可恶的家伙有强迫你! - )。

+0

你真的很有趣,乐于助人!我改正了这个例子中的错别字。现在我将更新问题并解释为什么我对使用相同名称感兴趣。 – bogdan 2010-08-11 09:38:32

+0

@bogdan,感谢您的荣誉和澄清。在Python中,当一个值必须有一个通用的默认值,但可以用特定的值覆盖每个调用时,前者通常用'default_'前缀命名 - 例如,请参阅socket模块getdefaulttimeout和' setdefaulttimeout'函数和'timeout'命名参数给各种函数(在这种情况下使用getter和setter函数,而不是“只是一个全局变量”)也很常见,因为_modules_不能使用内置的'property',这是什么让你总是避免在_classes_中的getters/setter)。 – 2010-08-11 14:56:55

0

两个解决方案:

  1. 重命名变量,即somevar_
  2. 将全局移到不同的模块。你可以写一个模块myappdefaults

    import myappdefaults 
    print myappdefaults.somevar 
    
1

为什么你的局部变量必须具有相同的名称作为全局变量?重命名其中一个看起来像是一个简单的解决方案。另一个选择是将全局变量作为参数传递,但这仍然会给你一个不同的变量名称来访问保存值。

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" 
相关问题