我想做的是:
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
感谢您的回答!
答案 0 :(得分:8)
attr = myObject.someAttr if myObject else ""
答案 1 :(得分:3)
如果attr
为None
,则会将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.someAttr
为None
,则会忽略它并将''
放入attr