簡體   English   中英

在運行時創建動態命名的函數

[英]Creating a dynamically named function at runtime

我正在創建一個名為pyma的簡單軟件包,可在pypi上使用。

我提供了一種使用稱為NDayEMA(n, data)的函數來計算N天的指數移動平均值的方法。 (實際上,這是一個名為NDayEMA的類,帶有一個稱為compute()的函數,但在這里是無關緊要的。)

我試圖在運行時創建一個動態命名的函數,作為用戶的快捷方式。

例如:

NDayEMA(30, data) 

EMA30(data)

會是一樣的

EMA23(data)
EMA1023(data)
EMA12(data)

也將可用。

我了解我將需要一些正則表達式和處理,您的答案中不需要這些處理; 我自己去拿! 我正在搜索如何接收用戶提供的函數名稱,並使用該名稱創建一個函數而不會引發錯誤消息。

這是與Laravel PHP框架等效的PHP

$user = DB::table('users')->where_email_and_password('example@gmail.com', 'secret');

這不能完全回答您的問題,但是我建議您不要執行您的要求。 您已經有一個采用數字和數據作為參數的方法,因此將數字轉換為不同的方法名稱似乎並不比您當前的方法更方便。

我同意阿里(Ari)的觀點-您嘗試做的事情並沒有真正給您帶來任何好處,因此可能不值得這樣做。

但是,如果你絕對要,你可以濫用模塊加載/ __getattr__和黑客的解決方案在此描述的職位

基本上,如果我們有一個名為foo.py的文件,如下所示:

def hello(n):
    print n

class NDayEMA(object):
    def __init__(self, n, day):
        self.n = n
        self.day = day

然后,您需要將foo.py的內容foo.py為如下所示:

import sys

class Testing(object):
    @staticmethod
    def hello(n):
        print n

    class NDayEMA(object):
        def __init__(self, n, day):
            self.n = n
            self.day = day

    def __getattr__(self, attr):
        if attr.startswith('EMA'):
            n = int(attr[3:])
            return lambda day: self.NDayEMA(n, day)
        else: 
            raise AttributeError

sys.modules[__name__] = Testing()

每當您嘗試調用對象中缺少的屬性或方法時,都會調用__getattr__方法。 但是,沒有適用於模塊的__getattr__函數。 因此,我們要做的是將模塊轉換成一個類,然后在最后將模塊替換為該類。

現在,我們可以導入foo並執行以下操作:

import foo

foo.hello(3)

a = foo.EMA39('test')
b = foo.EMA1000('test')

print a.n
print b.n

print 'done'

暫無
暫無

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

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