【问题标题】:Pythonic way to check if something exists?检查某些东西是否存在的Pythonic方法?
【发布时间】:2012-03-12 12:07:30
【问题描述】:

这是非常基本的,但我正在编码并开始想知道是否有一种 Python 的方法来检查某些东西是否不存在。如果它是真的,我会这样做:

var = 1
if var:
    print 'it exists'

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

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

如果我只关心 kn,这似乎是一种浪费。有没有办法检查没有 else 的东西是否不存在?

【问题讨论】:

  • 总有三元:stackoverflow.com/questions/394809/python-ternary-operator :) ...认为这可能不是最 Pythonic 的写法。
  • 如果var 实际上不存在,那么当您尝试使用它时会引发异常。这超出了if/else 可以处理的范围。 if var 假设 var 存在,并且测试它是否为“真-ish”(如果转换为布尔值则变为真而不是假)。
  • 您不是在检查变量是否存在,而是检查它的值是否为True作为布尔上下文。

标签: python if-statement


【解决方案1】:

LBYL 风格,“三思而后行”:

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

EAFP 风格,“请求原谅比许可更容易”:

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

在 Python 中编码时首选第二种样式 (EAFP),因为它通常更可靠。

【讨论】:

  • 测试 var 是否不存在:'var' 不在 locals() 中,'var' 不在 globals() 中
【解决方案2】:

我认为你必须小心你的术语,某物是否存在 和某物是否评估为 False 是两件不同的事情。假设你想要后者,你可以简单地做:

if not var:
   print 'var is False'

对于前者,它会不太优雅:

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

然而,我将迈出一大步冒险,无论是什么让您想要检查变量是否已定义,都可能以更优雅的方式解决。

【讨论】:

  • 对不起不是假的。意思是如果它不存在。我在 sql 查询中更频繁地使用它(我在 select 查询中包装了一个 if 语句,如果没有返回结果,那么我会做一些工作),所以不要假寻找不存在。
  • 好吧config = config() 然后if not config: 给了我“分配前引用的局部变量配置”:)
【解决方案3】:

检查变量是否已定义:

var = 2

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

检查是否为 None / False

if varz is None

...或

if not varz

【讨论】:

    【解决方案4】:
    if not var:
        #Var is None/False/0/
    
    if var:
        #Var is other then 'None/False/0'
    

    在 Python 中,如果 varibale 具有 None/False/0 中的任何值,则 If var 条件将失败...

    对于其他对象,它将调用__nonzero__ pythonic 方法,该方法可能返回TrueFalse,具体取决于其功能。

    【讨论】:

    • 这不会处理从未定义变量的情况,这是 OP 的问题。
    【解决方案5】:

    如果这是一本字典,你可以有

    mydict['ggg'] = ''   // doesn't matter if it is empty value or not.
    if mydict.has_key('ggg'):
       print "OH GEESH"
    

    但是,has_key() 已从 Python 3.x 中完全删除,因此,Python 的方式是使用 in

    'ggg' in mydict     # this is it!
    # True if it exists
    # False if it doesn't
    

    您也可以将in 用于元组、列表和集合。


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


    在使用变量之前定义它总是安全的(你会遇到“本地引用之前的赋值”,这意味着“var不在范围内”用简单的英语)。如果你用查询做一些事情,你可能会想要一个字典,并检查一个键是否存在,使用in

    【讨论】:

    • 所有解决方案中最简单的
    【解决方案6】:

    否定呢?

    if not var:
        print 'nope it does not'
    

    虽然这是查看 var 是否为 false / none 并且如果未定义 var 会爆炸。

    查看是否定义了 var:

    try:
        var
    except NameError:
        print 'not defined'
    

    【讨论】:

      猜你喜欢
      • 2014-05-12
      • 2012-06-04
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      相关资源
      最近更新 更多