有没有更好的方法来编写这段代码?我知道这很简单,但我写它的方式似乎很重复.
我不需要寻找一行天才代码,只是其他一些可读的有用替代品.
提前致谢!
def __unicode__( self ):
location = []
if self.room != None:
location.append( self.room )
if self.floor != None:
location.append( self.floor )
if self.building != None:
location.append( self.building )
location.append( self.property )
return ", ".join( location )
Run Code Online (Sandbox Code Playgroud)
self.property始终设置,这不是真正的self.room,self.floor和self.building.顺便说一句,这是models.pyDjango代码的一部分,万一有人想知道.
附带问题:使用property变量名称是个坏主意吗?我注意到property在语法下突出显示,但我查了一下,它不是 Python保留字.
这是完整的课程:
class Location( models.Model ):
def __unicode__( self ):
location = []
if self.room != None:
location.append( self.room )
if self.floor != None:
location.append( self.floor )
if self.building != None:
location.append( self.building )
location.append( self.property )
return ", ".join( location )
comments = models.TextField( blank = True )
room = models.CharField( max_length = 135, blank = True )
floor = models.CharField( max_length = 135, blank = True )
building = models.CharField( max_length = 135, blank = True )
property = models.ForeignKey( Property )
t_created = models.DateTimeField( auto_now_add = True )
t_modified = models.DateTimeField( auto_now = True )
Run Code Online (Sandbox Code Playgroud)
第一部分是对原始问题的回答,如果选择要追加的第一个非None元素.请参阅以下更新,以解决修订后的问题
如果不尝试疯狂的单行或太过花哨的东西,我认为这是一个非常简单的解决方案.只需循环遍历它们并附加第一个非None,然后中断.
for loc in (self.room, self.floor, self.building):
if loc is not None:
location.append(loc)
break
Run Code Online (Sandbox Code Playgroud)
如果你想要一个单行,这里是一个列表理解:
location = [l for l in (self.room, self.floor, self.building) if l is not None][:1]
Run Code Online (Sandbox Code Playgroud)
对最后一个更可读的妥协可能是:
options = (self.room, self.floor, self.building)
location = [l for l in options if l is not None][:1]
Run Code Online (Sandbox Code Playgroud)
@tzaman建议不要使用property变量名是正确的.它是内置类型:
>>> property
<type 'property'>
class property(object)
| property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
|
| fget is a function to be used for getting an attribute value, and likewise
| fset is a function for setting, and fdel a function for del'ing, an
| attribute. Typical use is to define a managed attribute x:
Run Code Online (Sandbox Code Playgroud)
更新
因为在你的评论中你提到了你真正想要的是那些非None的属性,它是一个超级简单的列表comp:
locations = [l for l in (self.room, self.floor, self.building) if l is not None]
Run Code Online (Sandbox Code Playgroud)
更新2: @Vaughn Cato评论中的一个很好的建议
locations = filter(None, [self.room, self.floor, self.building])
Run Code Online (Sandbox Code Playgroud)
只需使用or运营商:
first = self.room or self.floor or self.building
if first:
location.append(first)
Run Code Online (Sandbox Code Playgroud)
它会自动返回计算结果的第一个表达式的值True.此外,property它不是一个保留字,但它是一个内置的 - 所以是的,不要使用它.