使用“try”来查看变量是否被定义为Python中的不良做法?

时间:2013-05-30 12:39:37

标签: python variables

我在函数中有以下代码:

try:
    PLACES.append(self.name)
except NameError:
    global PLACES
    PLACES = [self.name]

导致from <file containing that code> import *返回

SyntaxWarning: name 'PLACES' is used prior to global declaration
  global PLACES

所以我想知道做这样的事情是否被认为是不好的做法,如果是这样的话,这样做的正确方法是什么?我是一个菜鸟。

4 个答案:

答案 0 :(得分:2)

是的,这被认为是一种不好的做法。只需确保定义变量即可。实际上,这与模块级分配一样简单,具有合理的默认值:

Places = []

如果在导入时不应该实例化默认值(例如,如果它非常有用,或者有一些副作用),您至少可以初始化None并检查the_thing is None何时&# 39; s需要,如果它仍然是None则初始化它。

答案 1 :(得分:2)

第一个问题是你不应该做from foo import *,这只是不好的做法,并且会导致命名空间冲突(顺便说一下,没有任何警告),并且会让你后来感到头疼。

如果您需要在两个模块之间共享全局存储空间;考虑腌制物体并在需要时将其取出;或k / v商店,缓存或其他外部商店。如果您需要存储丰富的数据,那么数据库可能是理想的。

检查名称是否指向某个对象通常是某处设计不良的迹象。如果名称不存在,您也不应该假设污染全局命名空间 - 您如何知道PLACES没有被故意删除?

答案 2 :(得分:1)

我只建议你移除全局PLACES,除了块:

global PLACES
try:
    PLACES.append(self.name)
except NameError:
    PLACES = [self.name]

答案 3 :(得分:0)

只需定义:

PLACES = []

之前的事情。

比以后:

PLACE.append(self.name)

如果选中

if PLACES:

空列表产生错误。这样你就可以知道那里是否有任何地方。当然,在你追加之前你不需要再检查了。