代码之家  ›  专栏  ›  技术社区  ›  Nishant Florentin

我们可以使用关键字参数是create partials吗?

  •  0
  • Nishant Florentin  · 技术社区  · 7 年前

    我们能用关键字参数和

    例如,我有以下代码:

    def create_folder_transformer(folder):
        return lambda predicate: lambda file_transformer: map(file_transformer,
            filter(predicate,
                os.listdir(folder)))
    

    我可以创造一个 folder_transformer 与一个特定的文件夹,然后提到'谓词等,但它有一个特定的顺序。不过,我认为这不必与订单挂钩。

    1. 如果我通过 predicate folder file_transformer 作为论据。现在如果我供应 文件夹 ,我得到一个部分函数
    2. 文件变压器 ,我得到一个部分函数 谓语 谓语 文件夹 .

    简而言之,有没有一个内在的部分创造者 递归地 继续生成部分函数,直到获得所有输入;如果满足输入,只需执行代码。我相信这叫做 在Haskell中,这是函数在默认情况下的执行方式。

    我认为可能有帮助的用例:

    1. 文件夹 具有 n 使用创建分部 文件夹

    2. 当我有一个特定的谓词,比如-filter out mp4 跨多个文件夹的文件-带有 喜欢 string.endswith(".mp4") 会更好。


    docs 但如果我没有填写一些参数,这些部分就不会返回部分。但自从我宣布 None ,我也不能指望。理想情况下,我希望 它本身的行为就像这样,甚至不用担心使用一个额外的函数,比如partial,也就是说它应该被烘焙到我的函数中。

    def folder_transformer(folder=None, predicate=None, transformer=None):
        return map(transformer, filter(predicate, os.listdir(folder)))
    
    file_transformer = partial(folder_transformer, predicate=os.path.isfile)
    
    # This gives me a "map" object, but I want another partial takes "transformer".
    current_transformer = file_transformer(folder=folder)
    # This works, but my question is can I make my function do this automatically. 
    current_transformer = partial(file_transformer,folder=folder)
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   Nishant Florentin    7 年前

    我带了一个小剧本来 个人的 使用。

    附言:如果有人知道图书馆可以做类似的事情,请告诉我。

    import inspect
    
    def curry(function):
        original_func = function
        original_args = inspect.signature(function).parameters
    
        def wrapper(**kwargs):
            call = True
            current_args = {}
            for each in original_args:
                if kwargs.get(each):
                    current_args[each] = kwargs.get(each)
                else:
                    call = False
            if call:
                original_func(**current_args)
            else:
                def partial(**nargs):
                    current_args.update(nargs)
                    return wrapper(**current_args)
                return partial
    
        return wrapper
    
    @curry
    def foo(a=None, b=None, c=None):
        print(a, b, c)
    
    # first partial
    bar_with_a = bar(a=1)
    # next partial
    bar_with_a_and_b = bar_with_a(b=1)
    # next partial
    bar_with_a_and_b = bar_with_a_and_b(b=2)
    # next partial
    bar_with_a_and_b = bar_with_a_and_b(a=2)
    # call
    bar_with_a_and_b(c=2)