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

时间:2012-01-03 23:12:35

标签: python

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

obj = my_dict.get('obj')
if obj:
    var = obj

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

5 个答案:

答案 0 :(得分:11)

get函数接受第二个参数,默认值为:

  

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

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

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

var = my_dict.get('obj', var)

答案 1 :(得分:4)

obj = my_dict.get('obj')
if obj:   # <--- test is 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'].__nonzero__() returned True (__bool__ for python 3)
  #      OR
  #        my_dict['obj'].__len__() returned something > 0
  #      OR
  #        my_dict['obj'] is not None, and is an instance which defines neither of __nonzero__ or __len__ 
  var = obj

当前在这里的所有其他5个答案(包括已接受的答案)都在蹦蹦跳跳,并且在您查找的值False时,您的行为将与您所要求的不同布尔上下文。

假设您已经定义了var,则可以使用此单行:

var = my_dict['obj'] if 'obj' in my_dict and my_dict['obj'] else var

但请注意,它与您的情况略有不同:如果先前未定义NameError,则会提升var,而您只是继续var不在范围内。

也许你应该澄清你的预期行为以消除一些困惑!

答案 2 :(得分:2)

我觉得这个表格最明确可读,我一直都在使用它:

moo = animals["cow"] if "cow" in animals else None

答案 3 :(得分:1)

假设my_dict就是它所说的(字典):

var = my_dict.get('obj') if 'obj' in my_dict else var

编辑以保留原始问题的意图。

答案 4 :(得分:-1)

var = thedict.get('thekey', var)