2009-10-20 39 views
270

Possible Duplicate:
Easy way to check that variable is defined in python?
How do I check if a variable exists in Python?确定是否变量在Python

定义你怎么知道一个变量是否已经被设置为在运行时代码一个特别的地方?这并不总是显而易见的,因为(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? 
+9

Duplicates:http://stackoverflow.com/questions/843277/python-checking-variable-existing,http://stackoverflow.com/questions/750298/easy-way-to-check-that-variable-is -python -defined, – carl 2009-10-20 06:50:58

+54

请请,请不要“有条件地”设置一个变量。这只是可怕的,可怕的设计。始终,始终提供所有逻辑路径。请不要继续这样做。 – 2009-10-20 10:35:38

+1

+1 S.Lott anwser。事实上,有办法做到这一点并不意味着你应该在一个新的项目中使用它。 – 2010-03-31 13:48:06

回答

451
try: 
    thevariable 
except NameError: 
    print "well, it WASN'T defined after all!" 
else: 
    print "sure, it was defined." 
+66

@Aaron:当你不知道变量是否定义时,有很多情况。您可以重构代码以避免在很多情况下出现这种情况,但不是所有情况。亚历克斯的解决方案是正确的,并且由于某些原因,当重现不可能时它是最好的。问题中没有太多的信息,所以我相信只有人问他可以选择最好的方式来处理他的案件。 – 2009-10-20 07:58:29

+124

@Aaron,“should”是一个4个字母的单词 - 例如没有哪个车手“应该”超过速度限制,但这并不意味着你不会对那些仍在使用的人采取一切正确和必要的预防措施。保留脆弱的,遗留的代码,其设计有些破碎,而且是从别人身上继承下来的,这是一个生活中的事实,那些只能从头开始思考大爆炸而不是谨慎和不断增加的重写需要重读Joel的9年-old essay http://www.joelonsoftware.com/articles/fog0000000069.html。 – 2009-10-20 14:51:37

+10

@ S.Lott人们用它来保持向后兼容性。在Python 3.1源代码中搜索NameError。有很多例子使用“try:var_name,除了NameError:something_else”。以下是使用它的几个地方:CSV(http://svn.python.org/projects/python/trunk/Lib/csv.py)库和ElementTree库(http://svn.python。组织/项目/蟒蛇/主干/库/ XML/etree/ElementTree.py)。 – sc45 2009-10-20 14:54:50

11
try: 
    a # does a exist in the current namespace 
except NameError: 
    a = 10 # nope 
+5

例外应仅用于特殊情况。参见[this discussion](http://stackoverflow.com/q/77127/1593077) – einpoklum 2015-04-10 22:17:38

+10

@einpoklum对于大多数语言来说都是如此,但是在Python中,例外情况会更频繁地使用,请参阅参考资料。 http://stackoverflow.com/questions/3086806 – sdcvvc 2015-04-27 20:32:52

+1

嗯,很奇怪,但真的,显然。我仍然认为这不是一个好主意(TM),但是,不能与社区风俗争论。 – einpoklum 2015-04-28 19:43:16

235

'a' in vars() or 'a' in globals()

如果你想成为迂腐

,您可以检查内建太
'a' in vars(__builtin__)

+17

这应该是我相信的答案。见http://stackoverflow.com/questions/843277/python-checking-variable-existing – 0atman 2010-11-04 13:41:49

+1

这是一个非常习惯的答案。这里有一个强大的用例来表示地图;例如,在{“prop0”中:“if”prop2“:无,”prop1“:无}:' – robert 2016-02-19 18:46:36

+0

该答案也适用于检测变量以外的成员,如函数,类和模块。 – aaaantoine 2017-09-15 15:22:44

91

我觉得这是更好地避免这种情况。这是更清洁和更清晰的写:

a = None 
if condition: 
    a = 42 
+6

如果你喜欢这样做,你应该使初始值独一无二,这样你就可以将'a'设置为'None'。 'UNDEFINED = object(); a = UNDEFINED'然后你可以用'a不是UNDEFINED'测试 – 2009-10-20 07:03:00

+11

这是None的常见用法。这实际上就是None的语义 - 它不是什么,nada,zip。它存在,但“没有价值”。如果None可以出现在赋值等中,那么使用non-None值非常有用,但这并不常见,因此避免使用None应该是标准做法。例如,在这个问题中,a只会是42或者不确定。将未定义更改为值为无会导致信息丢失。 – 2010-02-03 05:27:07

+3

这是方式,不知道为什么人们认为使用LONG和DIRTY try/except构造来完成这个过程。此外,在不想将默认值硬编码到参数列表(仅将默认值定义为类成员)的类成员函数中使用关键字args时,这非常有用。 – FizxMike 2014-02-14 17:13:44

4

对于这种特殊的情况下,最好做a = None而不是del a。这会将引用计数递减到对象a被分配给(如果有的话),并且在未定义a时不会失败。请注意,del语句不直接调用对象的析构函数,而是将其从变量中解除绑定。对象的析构函数在引用计数变为零时被调用。

4

一种可能的情况下,这可能需要:

如果使用finally块关闭连接,但在try块,程序与sys.exit()退出定义连接之前。在这种情况下,将调用finally块,并且连接关闭语句将失败,因为没有创建连接。

-2

如果想要赶上试图访问的对象里面没有定义的变量,有这样做的一个非常简单的方法:

class Whatever(object): 
    def __getattr__(self, key): 
    return None 

这里,蟒首先尝试找对象中的属性或对象树,并且只有在失败时调用__getattr__(self, key)函数。 这意味着,如果__getattr__被调用,我们可以简单地返回None

+0

-1'__getattr__'是查字典之前调用。 – quantum 2012-10-20 01:16:21

+0

@量子不,这不是,但'__getattribute__'是查字典之前调用。 – 2016-04-24 02:17:05

相关问题