我在函数中有以下代码:
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
所以我想知道做这样的事情是否被认为是不好的做法,如果是这样的话,这样做的正确方法是什么?我是一个菜鸟。
答案 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:
空列表产生错误。这样你就可以知道那里是否有任何地方。当然,在你追加之前你不需要再检查了。