Python:使用join编写if-then块的更好方法?

hob*_*es3 3 python

有没有更好的方法来编写这段代码?我知道这很简单,但我写它的方式似乎很重复.

我不需要寻找一行天才代码,只是其他一些可读的有用替代品.

提前致谢!

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.floorself.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)

jdi*_*jdi 9

第一部分是对原始问题的回答,如果选择要追加的第一个非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)


tza*_*man 5

只需使用or运营商:

first = self.room or self.floor or self.building
if first:
    location.append(first)
Run Code Online (Sandbox Code Playgroud)

它会自动返回计算结果的第一个表达式的值True.此外,property它不是一个保留字,但它是一个内置的 - 所以是的,不要使用它.