Печатать только если не ноль в 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 = "")