代码之家  ›  专栏  ›  技术社区  ›  JS.

如何以相同的方式对待Python单个vals和vals列表?

  •  4
  • JS.  · 技术社区  · 14 年前

    我经常遇到这个问题:我创建的函数需要对一个值执行一系列操作,不管该值是单个值还是一个值列表。

    有没有一种优雅的方法可以做到这一点:

    def convert_val(val):
       do a series of things to each value, whether list or single val
       return answer or list of answers
    

    而不是我一直在做什么

    def convert_val(val):
        if isinstance(val, list):
           ... do a series of things to each list item,
           return a list of answers
        else:
           ... do the same series, just on a single value
           return a single answer
    

    一种解决方案是创建一个子convert()来执行一系列操作,然后根据传入convert()的类型,只调用一次或迭代调用它。

    另一种方法是创建一个convert(),它将接受参数(value,sub\u convert())。

    (我在这里做了几次搜索,看看我的问题是否已经得到解决。我的任命(如果有)

    3 回复  |  直到 14 年前
        1
  •  4
  •   Thomas    14 年前

    如果函数对于单个值和列表都有意义,那么从逻辑上讲,函数对于某个列表项的结果将不依赖于列表中的其他项。

    例如, a b

    items = [1, 2]
    a = convert_val(items)
    b = map(convert_val, items)
    

    这个例子已经暗示了解决方案: 来电者 知道传入的是列表还是单个值。传递单个值时,函数可以按原样使用。传递列表时 map 调用很容易添加,并使调用方的情况更清楚。

        2
  •  6
  •   S.Lott    14 年前

    您需要修改您的设计,使所有功能的使用都正确无误。

    我们不是在谈论愚蠢的一致性。基于此函数的不一致使用,您可能存在设计问题。

    方案1。不要打电话 convert_val( x ) 哪里 x convert_val( [x] ) . 不要修复你的函数,修复所有使用你函数的地方。一致性有助于减少错误。

    方案2。更改的设计 convert_val 使用多个位置参数。这不能很好地概括。

    def convert_val( *args ):
        whatever it's supposed to do to the arguments.
    

    convert_val( *someList ) . 没关系,也许更接近你的意图。

    注意。

    您可以使用 warnings 模块。

    def convert_val( arg ):
        if isinstance( arg, collections.Sequence ):
            return convert_val_list( arg )
        else:
            warnings.warn( "Fix this" )
            return convert_val_list( [arg] )[0]
    
    def convert_val_list( arg ):
        assert isinstance( arg, collections.Sequence )
        the original processing
    

    convert_val = convert_val_list
    

        3
  •  0
  •   dosaki    8 年前

    我来晚了,我不确定这是不是OP想要的。

    我更喜欢将实现细节隐藏在函数中。打电话的人不应该关心里面发生了什么。

    def convert_val(val):
        values = []
        values.extend(val)
        for value in values:
            # do things to each list item,
        return a list of answers
    

    这将使 convert_val val 进入 values 瓦尔 进入 价值观 列表。

    此外,应该可以预见地得到一个列表回来(因为你会使用相同的逻辑)。

    最后:

    assert convert_val([1]) == convert_val(1)