簡體   English   中英

如何用Python或函數式編程語言創建函數擴展/函數接口/函數類?

[英]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 它們沒有相同的簽名:“接口”采用一個參數,而實現接口的函數采用兩個參數。 這與大多數人所說的接口不符。

如果要執行的是強制給定函數具有與另一個函數相同的參數並返回值,則可以通過檢查該函數的參數來實現。

  • stdlib中的inspect模塊可以告訴您函數采用什么參數,特別地, 簽名為此提供了一個不錯的API
  • 函數注釋允許您標記函數的參數並返回值,這可以用"# extends:"注釋代替您嘗試執行的操作
  • 另請參閱有關使用函數注釋進行可選鍵入mypy新建議
  • 一個修飾是添加這種檢查的完美的地方,因為它包裝的功能,它執行之前,很多人已經取得的類型檢查裝飾(例如: 123

有關chain函數,請參見在python中編寫函數 您可以修改其中的一種,也可以進行上述的檢查。

至於其他功能更多的語言如何執行這種操作,我不確定。 我看到上面鏈接到該接口文章中提到的類型類 ,看起來那里有一些不錯的信息。

如果您對要執行的操作有更多詳細信息或背景,請更新您的帖子!

暫無
暫無

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

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