Guy*_*emi 14 python if-statement
这里是python2的优秀示例.我对python3的翻译(如下所示)适用于我的所有测试.
def convert(data):
if isinstance(data, bytes):
return data.decode('ascii')
elif isinstance(data, dict):
return dict(map(convert, data.items()))
elif isinstance(data, tuple):
return map(convert, data)
else:
return data
Run Code Online (Sandbox Code Playgroud)
看起来就像我对从py2移植到py3的库大量使用它.
有没有人有更好的设计来完成同样的任务?这个可以优化吗?
pax*_*blo 16
不知道速度的优化,但我不是if/return/else范式的忠实粉丝,因为它用不必要的东西堵塞代码并且导致没有语言的缩进楼梯elif(这里没有这样的问题).
优化可读性(这通常是我的第一选择),我把所有这些elif线路进入if和沟else完全,重新格式化,使之更加紧凑:
def convert(data):
if isinstance(data, bytes): return data.decode('ascii')
if isinstance(data, dict): return dict(map(convert, data.items()))
if isinstance(data, tuple): return map(convert, data)
return data
Run Code Online (Sandbox Code Playgroud)
扩展paxdiablo的处理更多用例的答案导致以下结果:
def convert(data):
if isinstance(data, bytes): return data.decode()
if isinstance(data, (str, int)): return str(data)
if isinstance(data, dict): return dict(map(convert, data.items()))
if isinstance(data, tuple): return tuple(map(convert, data))
if isinstance(data, list): return list(map(convert, data))
if isinstance(data, set): return set(map(convert, data))
Run Code Online (Sandbox Code Playgroud)
很明显,map函数的应用是相当一致的,我们可以概括它.
def convert(data):
data_type = type(data)
if data_type == bytes: return data.decode()
if data_type in (str, int): return str(data)
if data_type == dict: data = data.items()
return data_type(map(convert, data))
Run Code Online (Sandbox Code Playgroud)
最简单的方法是使用字典理解如下:
new_data = { key.decode(): val.decode() for key, val in data.items() }
Run Code Online (Sandbox Code Playgroud)
例:
>>> data = {
... b'cart1': b'apples',
... b'cart2': b'oranges',
... b'cart3': b'grapes'
... }
>>>
>>> new_data = { key.decode(): val.decode() for key, val in data.items() }
>>>
>>> new_data
{'cart1': 'apples', 'cart2': 'oranges', 'cart3': 'grapes'}
>>>
Run Code Online (Sandbox Code Playgroud)
要以随机顺序转换字节类型的键值对,请使用:
new_data = {
key.decode() if isinstance(key, bytes) else key:
val.decode() if isinstance(val, bytes) else val
for key, val in data.items()
}
Run Code Online (Sandbox Code Playgroud)
例:
>>> data = {
... b'cart1': 'apples',
... 'cart2': b'oranges',
... b'cart3': b'grapes'
... }
>>>
>>> new_data = {
... key.decode() if isinstance(key, bytes) else key:
... val.decode() if isinstance(val, bytes) else val
... for key, val in data.items()
... }
>>> new_data
{'cart1': 'apples', 'cart2': 'oranges', 'cart3': 'grapes'}
>>>
Run Code Online (Sandbox Code Playgroud)
注意:上面的代码对于简单的数据字典会更好.但对于复杂的词典,我宁愿使用Guy Gangemi的代码,这是对paxdiablo答案的修改:
def convert(data):
if isinstance(data, bytes): return data.decode()
if isinstance(data, dict): return dict(map(convert, data.items()))
if isinstance(data, tuple): return tuple(map(convert, data))
if isinstance(data, list): return list(map(convert, data))
return data
Run Code Online (Sandbox Code Playgroud)
例:
>>>
>>> def convert(data):
... if isinstance(data, bytes): return data.decode()
... if isinstance(data, dict): return dict(map(convert, data.items()))
... if isinstance(data, tuple): return tuple(map(convert, data))
... if isinstance(data, list): return list(map(convert, data))
... return data
...
>>>
>>> data = {
... b'fruits': {
... b'cart1': b'apples',
... b'cart2': 'oranges',
... b'cart3': b'grapes',
... b'cart4': (b'banana', 'pear'),
... b'cart5': [b'kiwi', b'papaya']
... },
... 'vegetables': {
... 'cart1': b'carrots',
... b'cart2': None,
... b'cart3': {},
... b'cart4': False
... }
... }
>>>
>>> convert(data)
{'fruits': {'cart1': 'apples', 'cart2': 'oranges', 'cart3': 'grapes', 'cart4': ('banana', 'pear'), 'cart5': ['kiwi', 'papaya']}, 'vegetables': {'cart1': 'carrots', 'cart2': None, 'cart3': {}, 'cart4': False}}
>>>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13379 次 |
| 最近记录: |