Можем ли мы использовать ключевые аргументы и curry функцию, пока все аргументы не будут получены в любом порядке?
Например, у меня есть этот код:
def create_folder_transformer(folder):
return lambda predicate: lambda file_transformer: map(file_transformer,
filter(predicate,
os.listdir(folder)))
Я могу создать folder_transformer
с определенной папкой, а затем упомянуть «предикат» и т. Д. Но у него есть определенный порядок. Однако я не думаю, что это нужно привязывать к этому порядку.
Я бы хотел достичь чего-то вроде этого:
- Если я передам
predicate
, я получу частичную функцию, которая принимает folder
и file_transformer
в качестве аргументов. Теперь, если я поставлю folder
, я получу частичную функцию, которая принимает file_transformer
.
- Если я передам
file_transformer
, я получу частичную функцию, которая принимает predicate
и folder
в качестве аргументов. Теперь, если я поставлю predicate
, я получу частичную функцию, которая принимает folder
.
Короче говоря, есть встроенный частичный создатель, который рекурсивно продолжает генерировать частичные функции, пока не будут получены все входные данные; если ввод удовлетворен, просто выполните код. Я считаю, что в Haskell это называется curry , и именно так функции выполняются по умолчанию.
Использование случаев, когда я думаю, что это может помочь:
Когда я преобразую определенный folder
с помощью n
операций,
лучше создать партиал с folder
.
Когда у меня есть определенный предикат, такой как - отфильтровать mp4
файлов во многих папках - частичное с predicate
, как string.endswith(".mp4")
будет лучше.
Я прочитал частичные документы , но эти партиалы не возвращают партиалы, если я не заполнил некоторые аргументы. Но так как я объявил это как None
, я тоже не могу этого ожидать. В идеале мне бы хотелось, чтобы сама моя функция вела себя так, даже не беспокоясь об использовании дополнительной функции, такой как частичная, т.е. она должна быть встроена в мою функцию.
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)