基于python实例的类型检查

时间:2015-02-14 07:40:48

标签: python dry

我的代码如下:

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"在编辑中添加以澄清问题。)

2 个答案:

答案 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。