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

Los*_*oul 49 python if-statement

这是非常基本的,但我编码并开始想知道是否有一种pythonic方法来检查是否存在某些东西.这是我如何做到的,如果它是真的:

var = 1
if var:
    print 'it exists'
Run Code Online (Sandbox Code Playgroud)

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

var = 2
if var:
    print 'it exists'
else:
    print 'nope it does not'
Run Code Online (Sandbox Code Playgroud)

如果我所关心的只是一种浪费,似乎是一种浪费,如果没有其他东西,有没有办法检查是否存在某些东西?

wim*_*wim 120

LBYL风格,"在你跳跃之前看":

var_exists = 'var' in locals() or 'var' in globals()
Run Code Online (Sandbox Code Playgroud)

EAFP风格,"比允许更容易请求宽恕":

try:
    var
except NameError:
    var_exists = False
else:
    var_exists = True
Run Code Online (Sandbox Code Playgroud)

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

  • 测试 var 是否不存在:'var' 不在 locals() 中,'var' 不在 globals() 中 (2认同)

Pao*_*ino 24

我认为你必须小心你的术语,无论是否存在某种东西,并且评估为False的东西是两个不同的东西.假设你想要后者,你可以简单地做:

if not var:
   print 'var is False'
Run Code Online (Sandbox Code Playgroud)

对于前者,它将不那么优雅:

try:
   var
except NameError:
   print 'var not defined'
Run Code Online (Sandbox Code Playgroud)

然而,我想要进行一次飞跃和冒险,无论是什么让你想要检查变量是否被定义,都可以以更优雅的方式解决.


ava*_*sal 6

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

if var:
    #Var is other then 'None/False/0'
Run Code Online (Sandbox Code Playgroud)

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

对于其他对象,它将调用__nonzero__pythonic 方法,该方法可能返回True或 ,False具体取决于其功能。

  • 这不会处理变量从未定义的情况,这是OP的问题。 (6认同)

Cal*_*dge 6

要检查是否已定义 var:

var = 2

try: 
    varz
except NameError:
    print("No varz")
Run Code Online (Sandbox Code Playgroud)

检查它是否为 None / False

if varz is None
Run Code Online (Sandbox Code Playgroud)

...或者

if not varz
Run Code Online (Sandbox Code Playgroud)


Cpp*_*ner 5

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

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

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

'ggg' in mydict     # this is it!
# True if it exists
# False if it doesn't
Run Code Online (Sandbox Code Playgroud)

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


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


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