Max*_*rai 849 python variables exception
我想检查变量是否存在.现在我正在做这样的事情:
try:
myVar
except NameError:
# Do something.
Run Code Online (Sandbox Code Playgroud)
还有其他方法没有例外吗?
Aym*_*ieh 1464
要检查局部变量的存在:
if 'myVar' in locals():
# myVar exists.
Run Code Online (Sandbox Code Playgroud)
要检查全局变量的存在:
if 'myVar' in globals():
# myVar exists.
Run Code Online (Sandbox Code Playgroud)
要检查对象是否具有属性:
if hasattr(obj, 'attr_name'):
# obj.attr_name exists.
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 113
使用未定义或设置的变量(隐式或显式)几乎总是在任何语言中都是坏事,因为它表明程序的逻辑没有被正确地思考,并且可能导致不可预测的行为.
以下技巧与您的类似,将确保变量在使用前具有一些值:
try:
myVar
except NameError:
myVar = None
# Now you're free to use myVar without Python complaining.
Run Code Online (Sandbox Code Playgroud)
但是,我仍然认为这不是一个好主意 - 在我看来,你应该重构你的代码,以便不会发生这种情况.
小智 40
一种简单的方法是首先初始化它 myVar = None
然后是:
if myVar is not None:
# Do something
Run Code Online (Sandbox Code Playgroud)
小智 22
使用try/except是测试变量存在的最佳方法.但是,与设置/测试全局变量相比,几乎肯定有更好的方法来做你正在做的事情.
例如,如果您想在第一次调用某个函数时初始化模块级变量,那么最好使用以下代码:
my_variable = None
def InitMyVariable():
global my_variable
if my_variable is None:
my_variable = ...
Run Code Online (Sandbox Code Playgroud)
Wyr*_*ood 17
对于对象/模块,您也可以
'var' in dir(obj)
Run Code Online (Sandbox Code Playgroud)
例如,
>>> class Something(object):
... pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False
Run Code Online (Sandbox Code Playgroud)
sam*_*yse 11
我将假设测试将在函数中使用,类似于user97370的答案.我不喜欢这个答案,因为它会污染全局命名空间.修复它的一种方法是使用类来代替:
class InitMyVariable(object):
my_variable = None
def __call__(self):
if self.my_variable is None:
self.my_variable = ...
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个,因为它使代码变得复杂并且打开了诸如这样的问题,这是否应该确认Singleton编程模式?幸运的是,Python允许函数暂时具有属性,这为我们提供了这个简单的解决方案:
def InitMyVariable():
if InitMyVariable.my_variable is None:
InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None
Run Code Online (Sandbox Code Playgroud)
一种通常适用于处理这种情况的方法是不显式检查变量是否存在,而是继续并在try/except NameError中包装可能不存在的变量的第一次使用:
# Search for entry.
for x in y:
if x == 3:
found = x
# Work with found entry.
try:
print('Found: {0}'.format(found))
except NameError:
print('Not found')
else:
# Handle rest of Found case here
...
Run Code Online (Sandbox Code Playgroud)
我创建了一个自定义函数。
def exists(var):
return var in globals()
Run Code Online (Sandbox Code Playgroud)
然后调用如下所示的函数,替换variable_name
为您要检查的变量:
exists("variable_name")
Run Code Online (Sandbox Code Playgroud)
将返回True
或False