我想检查变量是否存在。现在我在做这样的事情:

try:
    myVar
except NameError:
    # Do something.

有没有其他没有例外的方法?


当前回答

这是我的设想:

for i in generate_numbers():
    do_something(i)
# Use the last i.

我不能轻易确定迭代对象的长度,这意味着I可能存在,也可能不存在,这取决于迭代对象是否产生一个空序列。

如果我想使用iterable的最后一个I(一个空序列不存在的I),我可以做以下两件事之一:

i = None  # Declare the variable.
for i in generate_numbers():
    do_something(i)
use_last(i)

or

for i in generate_numbers():
    do_something(i)
try:
    use_last(i)
except UnboundLocalError:
    pass  # i didn’t exist because sequence was empty.

第一个解决方案可能有问题,因为我不能告诉(取决于序列值)I是否是最后一个元素。第二种解决方案在这方面更为准确。

其他回答

它可能不是高性能的,但您将解决方案泛化为一个同时检查局部变量和全局变量的函数。

import inspect
def exists_var(var_name):
    frame = inspect.currentframe()
    try:
        return var_name in frame.f_back.f_locals or var_name in globals()
    finally:
        del frame

然后你可以这样使用它:

exists_var('myVar')

使用try/except是测试变量是否存在的最佳方法。但是几乎可以肯定有比设置/测试全局变量更好的方法。

例如,如果你想在第一次调用某个函数时初始化一个模块级变量,你最好使用这样的代码:

my_variable = None

def InitMyVariable():
  global my_variable
  if my_variable is None:
    my_variable = ...

处理这种情况的一种方法通常是不显式检查变量是否存在,而是直接将可能不存在的变量的第一次使用包装在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
  ...

我创建了一个自定义函数。

def exists(var):
     return var in globals()

然后调用函数,将variable_name替换为你想检查的变量:

exists("variable_name")

将返回True或False

这是我的设想:

for i in generate_numbers():
    do_something(i)
# Use the last i.

我不能轻易确定迭代对象的长度,这意味着I可能存在,也可能不存在,这取决于迭代对象是否产生一个空序列。

如果我想使用iterable的最后一个I(一个空序列不存在的I),我可以做以下两件事之一:

i = None  # Declare the variable.
for i in generate_numbers():
    do_something(i)
use_last(i)

or

for i in generate_numbers():
    do_something(i)
try:
    use_last(i)
except UnboundLocalError:
    pass  # i didn’t exist because sequence was empty.

第一个解决方案可能有问题,因为我不能告诉(取决于序列值)I是否是最后一个元素。第二种解决方案在这方面更为准确。