[英]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.