Pythonic的方式检查某个东西是否存在?

104

这很基础,但我在编码时开始想知道是否有一种Pythonic的方法来检查某个东西是否不存在。如果它为真,这是我如何做的:

var = 1
if var:
    print 'it exists'

但是当我检查某些东西不存在时,我经常会这样做:

var = 2
if var:
    print 'it exists'
else:
    print 'nope it does not'

如果我只关心kn,那么这似乎是一种浪费。有没有一种方法可以在没有else的情况下检查某个东西是否不存在?


总有三元运算符:https://dev59.com/IXRC5IYBdhLWcg3wJNqf :) ...虽然这可能不是最Pythonic的写法。 - summea
6
如果变量var实际上不存在,那么当您尝试使用它时会引发异常。这超出了if/else可以处理的范围。 if var 假定var存在,并测试它是否为“真值”(如果转换为布尔值,则变为True而不是False)。 - Karl Knechtel
1
你并没有检查变量是否存在,而是检查它的值是否为True作为布尔上下文。 - FallenAngel
6个回答

211

采用 LBYL 风格,即 "先看后跳":

var_exists = 'var' in locals() or 'var' in globals()

EAFP风格,即“宁愿请求原谅也不要请求许可”:

try:
    var
except NameError:
    var_exists = False
else:
    var_exists = True

在Python编程时,更倾向于使用第二种风格(EAFP),因为它通常更可靠。


4
检测变量是否不存在:'var' not in locals() 并且 'var' not in globals()。 - MyopicVisage

42

我认为你在术语上必须小心,存在和求值为False是两回事。假设你想要后者,你可以简单地执行:

if not var:
   print 'var is False'

对于前者,它将不够优雅:

try:
   var
except NameError:
   print 'var not defined'

我将冒险猜测,您想要检查变量是否已定义的原因可能可以用更加优雅的方式解决。


抱歉,我不是指“false”,而是指如果不存在。我在SQL查询中经常使用它(我将一个if语句包装在一个select查询中,如果没有结果返回,则进行一些工作),因此不是false,而是寻找不存在的情况。 - Lostsoul
好的 config = config() 然后 if not config: 给我返回 "local variable config referenced before assignment" :) - holms

7
如果这是一个字典,您可以拥有它。
mydict['ggg'] = ''   // doesn't matter if it is empty value or not.
if mydict.has_key('ggg'):
   print "OH GEESH"

然而,在Python 3.x中完全删除了has_key(),因此Python的正确做法是使用in
'ggg' in mydict     # this is it!
# True if it exists
# False if it doesn't

您也可以对元组、列表和集合使用 in


当然,如果变量未定义,您将不得不静默地引发异常(只需引发任何异常……让它通过),如果异常不是您想要看到的(这对于许多应用程序很有用,您只需要记录异常即可)。


在使用变量之前定义变量总是安全的(您将遇到“本地引用前分配”错误,即“ var 不在作用域内”)。如果您对查询执行某些操作,则可能希望拥有一个字典,并检查是否存在键,使用 in


最简单的解决方案 - DrStrangepork
这对于字典不起作用。 - Jose4Linux

6
if not var:
    #Var is None/False/0/

if var:
    #Var is other then 'None/False/0'

在Python中,如果变量的值为None/False/0,则If var条件将失败...

而对于其他对象,它将调用__nonzero__ Pythonic方法,该方法可能根据其功能返回TrueFalse


6
这将无法处理变量从未定义的情况,这是 OP 提出的问题。 - btown

6

检查变量是否已定义:

var = 2

try: 
    var
except NameError:
    print("No var")

检查是否为None/False

if var is None

...or

if not var

3
什么是否定?
if not var:
    print 'nope it does not'

尽管这是为了检查变量是否为 false / none,如果未定义 var,则会出错。

要检查 var 是否已定义:

try:
    var
except NameError:
    print 'not defined'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接