在runtim创建动态命名函数

2024-04-29 19:05:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个名为pyma的简单包,可在pypi上使用。你知道吗

我用一个叫做NDayEMA(n, data)的函数提供了一种计算N天指数移动平均数的方法。(事实上,它是一个名为NDayEMA的类,有一个名为compute()的函数,但在这里并不相关。)

我试图在运行时创建一个动态命名的函数作为用户的快捷方式。你知道吗

例如:

NDayEMA(30, data) 

以及

EMA30(data)

会是一样的

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

也可以使用。你知道吗

我知道我将需要一些注册和处理,这是不需要在你的答案,我会得到它自己!我正在搜索如何接收用户提供的函数名,并使用该名称创建函数,而不引发错误消息。你知道吗

这里是来自Laravel PHP framework的PHP等价物。你知道吗

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

Tags: 方法函数用户pypidata动态指数命名
2条回答

这并不能完全回答你的问题,但我建议不要按你的要求去做。您已经有了一个将数字和数据作为参数的方法,因此将数字转换为不同的方法名似乎比您当前的方法更方便。你知道吗

我同意阿里的观点,你所做的并没有给你带来任何好处,所以可能不值得去做。你知道吗

但是,如果您确实想这样做,您可以滥用模块加载/__getattr__,并按照本post中所述破解一个解决方案。你知道吗

基本上,如果我们有一个名为foo.py的文件,它是这样的:

def hello(n):
    print n

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

然后,您需要将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'

相关问题 更多 >