0

我正在尝试编写一个程序来执行算术 mod n,给定 n。我想知道在 Python(最好是 2.7)中是否有任何方法可以动态定义一个函数,使其行为取决于用于调用它的名称。更具体地说,我想定义一个名为“* mod”的函数,其中 * 是一个整数,然后执行算术 mod *。也许更清楚的是,我想为 *mod 编写一个函数定义,定义函数 2mod、3mod、4mod 等等。这可能吗?如果有人问过类似的问题,或者我的答案在文档中很容易找到,我深表歉意;我试图搜索它,但我不知道如何描述我正在寻找的功能,所以我可能错过了它。

谢谢!

4

4 回答 4

4

你不想那样做。只需制作一个简单的函数并将两个数字作为参数传递:

def mod(x, n):
    return x % n

print mod(5, 2)
# 1
于 2013-07-10T08:13:22.153 回答
3

好吧,如果你真的,真的想,看看这个快速破解。它使用包装类将模块包装在一个类中,因此您可以使用__getattr__

import sys
import functools

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

class Wrapper(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped
    def __getattr__(self, name):
        try:
            # quick hack. Don't try this at home :-)
            f = ''.join(x for x in name if not x.isdigit())
            n = ''.join(x for x in name if x.isdigit())
            return functools.partial(getattr(self.wrapped, f), int(n))
        except:
            return getattr(self.wrapped, name)

sys.modules[__name__] = Wrapper(sys.modules[__name__])

现在,当你add10(12)在这个模块上调用 eg 时,结果是 22。注意方法名不能以数字开头,但是你可以使用 like_add的名字并调用方法 like_55add(45)等等。

但我会听从Haidro 的建议你不想那样做。只需使用两个参数调用该方法就简单多了。

于 2013-07-10T08:31:03.103 回答
1

使用全局变量,lambda:

for i in range(2, 5):
    globals()['mod{}'.format(i)] = lambda x, n=i: x % n

assert mod2(4) == 0
assert mod2(3) == 1
assert mod3(2) == 2
assert mod3(1) == 1
assert mod4(1) == 1
assert mod4(2) == 2
assert mod4(3) == 3
assert mod4(9) == 1
于 2013-07-10T08:30:39.503 回答
0

您可以通过将函数生成为字符串,然后通过exec此字符串获取当前命名空间中的函数来实现此目的。就像是:

n = 2
s = 'def mod%i(x):' % n
s += '    return x %% %i' % n
exec s

这将定义函数mod2(x)

于 2013-07-10T08:10:18.090 回答