如果存在,则写入的简短方法

时间:2014-04-10 08:47:46

标签: python expression default

我想做的是:

if myObject:  # (not None)
    attr = myObject.someAttr
else:
    attr = ''

尽可能避免三元表达。是否有类似的东西:

attr = myObject.someAttr || '' ? 

我正在考虑创建自己的函数,例如:

get_attr_or_default(instance,attr,default):
    if instance:
        return instance.get_attribute(attr)
    else:
        return default

但是听到python没有这方面的捷径我会感到惊讶。

综合:

我尝试了两种解决方案,结果如下:

class myClass(Models.model):
    myObject = model.foreignKey('AnotherClass')

class AnotherClass(Models.model):
    attribute = models.charField(max_length=100,default = '')


attr = myClass.myObject.attribute if myClass.myObject else '' # WORKED
attr = myClass.myObject and myClass.myObject.attribute # WORKED with NONE as result
attr = myClass.myObject.attribute or ''  # Raises an error (myObject doesn't have attribute attribute)
try: attr = myClass.myObject.attribute
except AttributeError: attr = ''  # Worked

感谢您的回答!

6 个答案:

答案 0 :(得分:8)

6.11. Conditional expressions

attr = myObject.someAttr if myObject else ""

答案 1 :(得分:3)

如果attrNone,则会将myObject设置为None,如果是正确的对象,则设置为someAttr

attr = myObject and myObject.someAttr

右侧的评估仅在值需要时执行,请参阅Python Docs,其中说:

  

在和的情况下,如果左侧相当于False,则   未评估右侧,并返回左侧值。

这与C#具有的?? null-coalsecing运算符的模式相同,请参阅http://msdn.microsoft.com/en-us/library/ms173224.aspx

请注意,如果对象上有布尔运算符,则无法正常工作。如果是,则需要使用myObject is not None

答案 2 :(得分:2)

很酷的方式(甚至没有三元表达式):

attr = getattr(myObject or object(), 'someAttr', '')

object()返回一个新的无特征对象(引用文档)。

如果myObject or object()为空,

object()将返回myObject

逻辑:

    myObject is empty?
          / \
         /   \ N
        /     \ 
     Y /    getattr(myObject, ...) returns that attribute 
      /          
     /
    /
getattr(object(), ...) will produce '' (empty string)

答案 3 :(得分:1)

充其量你可以做到:

try:
    attr = myObject.someAttr
except AttributeError:
    attr = ''

答案 4 :(得分:1)

如果你真的坚持以奇怪,复杂和棘手的方式做事,你可以尝试:

val = (myObject is not None and myObject.attr) or default

这是旧的(并且极具争议性)前三元表达式成语。请注意,如果bool(myObject.attr)躲避False,这将 NOT 按预期工作(对于大多数空容器,空字符串,数字零和非常多非空容器都是如此)内置类型)。

TL; DR:使用三元表达式,这是它的用途。

答案 5 :(得分:0)

你自己建议的是什么,但略有不同:

if myObject:
    attr = myObject.someAttr or ''

如果myObject.someAttrNone,则会忽略它并将''放入attr