用于有条件地分配变量的Python简写

Spi*_*ike 3 python

我发现自己经常写这样的东西而且看起来太罗嗦了:

obj = my_dict.get('obj')
if obj:
    var = obj
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?也许在一条线?

Kri*_*ass 11

get函数采用第二个参数,默认值:

get(key [,default])如果key在字典中,则返回key的值,否则返回default.如果未给出default,则默认为None,因此此方法永远不会引发KeyError.

http://docs.python.org/library/stdtypes.html

因此,您可以使用以下内容复制问题的代码:

var = my_dict.get('obj', var)
Run Code Online (Sandbox Code Playgroud)

  • 但仍然不是真的相同.考虑一下`my_dict = {'obj':0}`的情况.你是否重新分配`var`?你的代码确实存在,OP会使`var`保持不变. (3认同)
  • 啊,也是一个好点,我的坏.我确实想知道OP是否打算采取这种行为 - 这是我经常犯的一个错误,经常看到其他人这样做...... (2认同)

wim*_*wim 5

没有一种干净的方法可以在一行中替换此代码,因为它有条件地绑定了 name var。在var已经定义的情况下,这种单行是可能的:

var = my_dict['obj'] if 'obj' in my_dict and my_dict['obj'] else var
Run Code Online (Sandbox Code Playgroud)

但是,如果var尚未定义,这仍然与原始代码略有不同:单行NameError代码正在引发 a并且原始代码只是继续var未绑定。

请注意,当值存在但为假时,其他答案的行为会有所不同。

obj = my_dict.get('obj')
if obj:   # <-- test on truthiness of obj
    # if we are here, it means:
    #   1. my_dict has key 'obj', AND...
    #   2. at least one of the following,
    #        my_dict['obj'].__bool__() returned True (__nonzero__ for Python 2)
    #      OR
    #        my_dict['obj'].__len__() returned result > 0
    #      OR
    #        my_dict['obj'] is not None, and has neither __bool__ nor __len__ defined
    var = obj
Run Code Online (Sandbox Code Playgroud)