我的代码如下:
def transform_incoming_json_item(item, things=[]):
if isinstance(item, list):
for thing in item:
things.append(process_thing(thing))
elif isinstance(item, dict):
things.append(process_thing(item))
return things
是否有更多的pythonic方法,只需要对process_thing进行一次调用(同时保留类型检查和两种情况,需要循环与无循环)?
(注意:"更多pythonic"在编辑中添加以澄清问题。)
答案 0 :(得分:2)
如何:对于dict
情况,将dict转换为带有单个项目的列表(dict对象):
def transform_incoming_json_item(item, things=[]):
if isinstance(item, dict): # <----
item = [item] # <----
if isinstance(item, list):
things.extend(process_thing(thing) for thing in item)
return things
注意:参数things
在定义时间内创建(仅一次)。换句话说,当调用函数transform_incoming_json_item
时,事情不会被初始化。
如果那不是您想要的,您需要采取以下方式:
def transform_incoming_json_item(item, things=None):
if things is None:
things = []
if isinstance(item, dict): # <----
item = [item] # <----
if isinstance(item, list):
things.extend(process_thing(thing) for thing in item)
return things
答案 1 :(得分:1)
使用falsetru将dict转换为列表的想法,您可以进一步简化代码:
def transform_incoming_json_item(item, things=None):
return ([] if things is None else things +
[process_thing(thing) for thing in (
item if isinstance(item, list) else
[item] if isinstance(item, dict) else [])])
如您所见,它相当紧凑。但是,如果列表理解这长期混淆了你或者不是你的事情,你显然应该选择其他答案。就个人而言,我发现它们非常适合这种情况,但YMMV。