簡體   English   中英

在Python中以相反的順序進行咖喱

[英]Currying in inversed order in python

假設我有一個像這樣的函數:

from toolz.curried import *

@curry
def foo(x, y):
    print(x, y)

然后我可以打電話給:

foo(1,2)
foo(1)(2)

兩者返回相同的預期。

但是,我想做這樣的事情:

@curry.inverse # hypothetical
def bar(*args, last):
    print(*args, last)

bar(1,2,3)(last)

其背后的想法是,我想預先配置一個函數,然后將其放入這樣的管道中:

pipe(data,
    f1, # another function
    bar(1,2,3) # unknown number of arguments
)

然后, bar(1,2,3)(data)將被稱為管道的一部分。 但是,我不知道該怎么做。 有任何想法嗎? 非常感謝你!

編輯:

要求提供一個更說明性的例子。 因此,它來了:

import pandas as pd
from toolz.curried import *

df = pd.DataFrame(data)

def filter_columns(*args, df):
    return df[[*args]]

pipe(df,
    transformation_1,
    transformation_2,
    filter_columns("date", "temperature")
)

如您所見,DataFrame通過函數傳遞,而filter_columns是其中之一。 但是,該函數是預先配置的,並且返回一個僅接受DataFrame的函數,類似於裝飾器。 可以通過以下方式實現相同的行為:

def filter_columns(*args):
    def f(df):
        return df[[*args]]
    return f

但是,我總是必須接着運行兩次調用,例如filter_columns()(df) ,這是我要避免的事情。

好吧,我不熟悉toolz模塊,但是似乎沒有簡單的方法來咖喱具有任意數量參數的函數,因此讓我們嘗試其他方法。

首先作為替代

def filter_columns(*args):
    def f(df):
        return df[*args]
    return f

(順便說一下, df[*args]是語法錯誤)

為了避免filter_columns()(data)您可以只獲取args的最后一個元素,並使用切片符號來獲取其他所有內容,例如

def filter_columns(*argv):
    df, columns = argv[-1], argv[:-1]
    return df[columns]

並用作filter_columns(df)filter_columns("date", "temperature", df)等。

然后使用functools.partial來構建新的,部分應用的過濾器來構建管道,例如

from functools import partial
from toolz.curried import pipe # always be explicit with your import, the last thing you want is import something you don't want to, that overwrite something else you use

pipe(df,
    transformation_1,
    transformation_2,
    partial(filter_columns, "date", "temperature")
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM