这个问题在这里已经有了答案:Easy way to check that a variable is defined in python? [重复] (5个回答) 2年前关闭。
您如何知道变量是否已在运行时代码中的特定位置设置?这并不总是很明显,因为(1)可以有条件地设置变量,(2)可以有条件地删除变量。我正在寻找类似 Perl 中的 defined()
或 PHP 中的 isset()
或 Ruby 中的 defined?
之类的东西。
if condition:
a = 42
# is "a" defined here?
if other_condition:
del a
# is "a" defined here?
import
来“获取”一个“配置文件”(即其中只有分配的文件)时,很可能是那里没有定义一些变量。 import
肯定比 ConfigParser
更便宜/更简单,所以对我来说,实用主义在这里胜过美感。
try:
thevariable
except NameError:
print("well, it WASN'T defined after all!")
else:
print("sure, it was defined.")
'a' in vars() or 'a' in globals()
如果您想学究气,也可以检查内置函数
'a' in vars(__builtins__)
if "prop2" in {"prop0": None, "prop1": None}:
vars(__builtin__)
仍然有效(对于 Python 2 或 3)。我相信 vars(__builtins__)
(注意复数 ;-)) 现在应该用于两个版本(测试:Python 2.7.10 和 Python 3.6.1)。
globals()
是 locals()
的超集。
我认为最好避免这种情况。写得更干净更清晰:
a = None
if condition:
a = 42
a
到 None
即。 UNDEFINED=object();a=UNDEFINED
然后您可以使用 a is not UNDEFINED
进行测试
null
值视为与未指定值不同(例如,None
将实际 JSON 值设置为 null
,而未指定将其排除在 JSON 之外消息,这使得 API 使用默认值或从其他属性计算),您需要区分 None
和 Undefined
,或 None
和 JSON null
。认为 None
不能或不应该被用作与明确未指定或未定义的值不同的想法是非常短视的。
try:
a # does a exist in the current namespace
except NameError:
a = 10 # nope
if 'a' in vars() or 'a' in globals()
解决方案,它不需要异常
对于这种特殊情况,最好使用 a = None
而不是 del a
。这将减少分配给对象 a
的引用计数(如果有),并且在未定义 a
时不会失败。请注意,del
语句不直接调用对象的析构函数,而是将其与变量解除绑定。当引用计数为零时调用对象的析构函数。
可能需要这样做的一种可能情况:
如果您使用 finally
块关闭连接但在 try
块中,则程序在定义连接之前以 sys.exit()
退出。在这种情况下,将调用 finally
块并且连接关闭语句将失败,因为没有创建连接。
不定期副业成功案例分享
for
语句中使用异常StopIteration
- 这就是迭代器如何让它知道它已经完成了。当然,要完成迭代与“例外情况”相去甚远——事实上,人们期望大多数 迭代终止。因此,很明显,您对“应该”如何使用异常的观点不正确地适用于 Python(其他语言有不同的语用学和问题 cannot 被正确地视为“语言不可知论”,如您所指的 Q)。