1

我在函数中有以下代码:

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

4 回答 4

2

是的,这被认为是一种不好的做法。只要确保定义了变量。几乎总是,这就像具有合理默认值的模块级分配一样简单:

Places = []

当默认值不应该在导入时实例化(例如,如果它非常昂贵,或者有一些副作用),您至少可以初始化None并检查是否the_thing is None需要它,如果它仍然是初始化它None

于 2013-05-30T12:46:59.677 回答
2

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

如果需要在两个模块之间共享一个全局存储空间;考虑对物体进行酸洗并在需要时将其拆开;或 ak/v 存储、缓存或其他外部存储。如果您需要存储丰富的数据,数据库可能是理想的选择。

检查名称是否指向对象通常是某处设计不佳的标志。如果名称不存在,您也不应该假设污染全局名称空间 - 您怎么知道PLACES不是故意删除的?

于 2013-05-30T12:57:49.170 回答
1

我只建议您将全局 PLACES 移出 except 块:

global PLACES
try:
    PLACES.append(self.name)
except NameError:
    PLACES = [self.name]
于 2013-05-30T12:43:24.383 回答
0

只需定义:

PLACES = []

在其他任何事情之前。

比后来:

PLACE.append(self.name)

如果检查

if PLACES:

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

于 2013-05-30T12:42:19.333 回答