[英]How to create function extensions / function interfaces / classes of functions in Python or functional programming languages?
我想定義一些最好在Python中稱為“函數擴展” /“函數接口”或“函數類”的東西。 尚未見過其他語言的類似構造,但我不是LISP等功能語言的專家。 朱莉婭(Julia)說,如果以后更容易做到,請考慮改用其他語言。
“函數擴展”將是表達綁定一個函數的幾個參數的正式方法,我們最終得到一個屬於特定“函數類”的函數。 在下面的示例中,特定的“函數類”是數據轉換函數(如transform_data_func_class
),它具有唯一的參數: data
。 power_data
擴展了transform_data_func_class
因為它綁定了exponent
參數,所以我們最終得到了一個函數,該函數屬於'函數類' transform_data_func_class
。
“功能類別”定義了簽名的一部分,例如:
def transform_data_func_class(data):
raise InterfaceError('Called unimplemented function class.')
然后定義擴展“函數類”的函數:
def power_data(data, exponent): # extends: transform_data_func_class
return data ** exponent # apply the additional the parameter
這樣,在綁定其他參數時,我們得到的簽名與擴展的“函數類”的簽名匹配:
square = partial(power_data, exponent=2) # matches signature transform_data_func_class(data)
我將使用這些示例,以指定功能類型作為其他功能的輸入和輸出:
def chain(data, transform_data_func_class_list):
"""Passing in data and a list of functions being elements of
transform_data_func_class with a sole argument: data."""
...
奇怪的是,對於一般對象而言,定義類/類型相對容易,而對於函數而言,則沒有如此明顯的構造。 目前,我使用extends: function_class
注釋來指定函數類型/類-從mypy
借用的想法-理想情況下將使用更正式的東西。
歡迎提出任何建議,如果我可以通過__call__
調用生成的構造,那將很好。 想過像這樣的課:
class TransformDataFuncClass(object):
@classmethod
def exec(cls, data):
raise InterfaceError('Called unimplemented function class.')
但是,不要喜歡無休止的exec()調用。 還想到了:
class TransformDataFuncClass(object):
@classmethod
def __call__(cls, data):
raise InterfaceError('Called unimplemented function class.')
但是我得到TypeError: object() takes no parameters
調用TransformDataFuncClass(data=1)
時TypeError: object() takes no parameters
。 通過類繼承來發信號通知“功能擴展”將是一個好方法。
我最精心的計划是:
class FuncClass(object):
"""Takes care of function classes and extensions being
just callable through __call__, e.g. PowerData(data=1, power=2)
instead of instantiating first: PowerData()(data=1, power=2)"""
def __init__(self, wrapped_class):
self.wrapped_class = wrapped_class
self.wrapped_instance = wrapped_class()
def __call__(self, *args, **kwargs):
return self.wrapped_instance(*args, **kwargs)
@FuncClass
class TransformDataFuncClass(object):
def __call__(self, data):
raise InterfaceError('Called unimplemented function class.')
@FuncClass
class PowerData(TransformDataFuncClass.wrapped_class):
def __call__(self, data, exponent):
return data ** exponent # apply the additional the parameter
這樣TransformDataFuncClass(data=1)
和PowerData(data=1, exponent=2)
是自然有效的調用。 盡管后者實際上工作起來有點復雜,並且由於我從dill
得到了錯誤,所以無法並行化計算( dill
是一種更好的替代pickle
),並說<class PowerData>: it's not the same object as PowerData
。
真的有任何建議歡迎。 我也對理論上的考慮以及其他語言中的實現方式感興趣。
很難看出您要完成什么。 具體來說,對於這兩個函數定義:
def transform_data_interface(data):
raise InterfaceError('Called unimplemented interface.')
def power_data(data, param1): # extends: transform_data_interface
return data ** param1 # apply the additional the parameter
power_data
如何擴展transform_data_interface
? 它們沒有相同的簽名:“接口”采用一個參數,而實現接口的函數采用兩個參數。 這與大多數人所說的接口不符。
如果要執行的是強制給定函數具有與另一個函數相同的參數並返回值,則可以通過檢查該函數的參數來實現。
"# extends:"
注釋代替您嘗試執行的操作 有關chain
函數,請參見在python中編寫函數 。 您可以修改其中的一種,也可以進行上述的檢查。
至於其他功能更多的語言如何執行這種操作,我不確定。 我看到上面鏈接到該接口文章中提到的類型類 ,看起來那里有一些不錯的信息。
如果您對要執行的操作有更多詳細信息或背景,請更新您的帖子!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.