假设我要将音频轨道信息解析为两个变量,例如:



'2/15'-> track = 2, num_tracks = 15


'7'-> track = 7, num_tracks = None


用Python做到这一点的优雅方法是什么?例如:

track, num_tracks = track_info.split('/')


这适用于第一种格式,但不适用于第二种格式,从而引发ValueError:需要多个值来解压。所以我想出了这样的方法:

评论

除了不要使用裸露的东西;仅捕获特定的异常。您会惊讶地发现,除了语句外,还有多少个错误可以被一揽子掩盖。

#1 楼


try:
    track, num_tracks = track_info.split('/', 1)
except:
    track, num_tracks = track_info, None



老实说,这不是一个糟糕的解决方案。但是您几乎永远不要使用except:;您应该捕获特定的异常。

这是另一种方法:

tracks, _, num_tracks = text.partition('/')
return int(tracks), int(num_tracks) if num_tracks else None


评论


\ $ \ begingroup \ $
我将删除参数maxsplit = 1进行拆分。如果文本包含多个'/',则报错是一件好事。
\ $ \ endgroup \ $
– Emanuele Paolini
2014年8月10日18:05



#2 楼

这可能过于笼统,但可以重用。它通过使序列足够长以适合请求的长度来“填充”序列,并根据需要添加给定填充项目的重复次数。
因此,如果没有第二个元素,则其想法是将其扩展为2个元素,并且都为None:

def right_pad(length, seq, padding_item=None):
    missing_items = length - len(seq)
    return seq + missing_items * [ padding_item]


#3 楼

您可以使用默认值连接数组。

track, num_tracks = (track_info.split('/', 1) + [None])[:2]