[英]Creating dynamically named variables in a function in python 3 / Understanding exec / eval / locals in python 3
[英]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.