Печатать только если не ноль в Python - однострочный метод?

У меня есть объект класса, Task, с четырьмя свойствами, t, date, priority а также checked. Толькоtдолжен содержать значение, остальные три свойства необязательны. Я написал метод печати, который будет печатать строки, если они не нулевые:

class Task:
    def __init__(self, _t, _date=None, _priority=None, _checked=False):
        self.t = _t
        try:
            self.date = parser.parse(_date, dayfirst=True) if _date else None
        except:
            self.date = None
        self.priority = _priority
        self.checked = _checked

    def print(self):
        print(self.t, end="")
        if self.date:
            print(self.date, end="")
        if self.priority:
            print(self.priority, end="")

... Но мне было интересно, есть ли способ сжать это в одну строку. В VB.NET вы можете сделать что-то вроде этого:

Console.Writeline(me.t, If(me.date Is Not Nothing, me.date, ""), If(me.priority Is Not Nothing, me.priority, ""))

Я пробовал сделать это на Python примерно так, как показано ниже, но это не работает так же:

print(self.t, if(self.date, self.date), if(self.priority, self.priority))

Есть ли однострочное решение или более аккуратный способ?

3 ответа

Вы можете использовать filter с None или bool и тем самым избежать печати None ценности

def print(self):    
    print(*filter(None, [self.t, self.date, self.priority]))

Или

def print(self):    
    print(*filter(bool, [self.t, self.date, self.priority]))

Вы можете создать список, а затем проверить, не соответствует ли список None:

class Task:
    def __init__(self, _t, _date=None, _priority=None, _checked=False):
        self.t = _t
        try:
            self.date = parser.parse(_date, dayfirst=True) if _date else None
        except:
            self.date = None
        self.priority = _priority
        self.checked = _checked
        self.print_list = [_t, _date, _priority]

    def print(self):
        [print(i, end=' ') for i in self.print_list if i is not None]

t = Task(_t=4, _date=25)
t.print()

Составление списка для каждой переменной, которая is not None:

def print(self):
        [print(i, end=' ') for i in self.print_list if i is not None]

Также эквивалент:

def print(self): print(*[i for i in self.print_list if i is not None], end="")

Возможно, даже сделают двух зайцев одним выстрелом dict

class Task:
    def __init__(self, _t, _date=None, _priority=None, _checked=False):
        try:
            temp_date = parser.parse(_date, dayfirst=True) if _date else None
        except:    # I suggest making the except capture a more specific case
            temp_date = None
        self.entities = {'t': _t, 'date': temp_date, 'priority': _priority}

    def print(self): print([v for _, v in self.entities.items() if v is not None], end="")

t = Task(_t=4, _date=25)
t.print()

Вы можете объединить их и распечатать, это позаботится о нулях:

def print(self):
    string= self.t + " " + self.date + " " + self.priority
    print(string,end = "")
Другие вопросы по тегам