Python使用字典键作为函数名

2024-04-27 14:44:34 发布

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

我希望能够使用字典键作为函数名,但我不确定是否可行。作为一个简单的例子,我想要一个class().dictkey(otherstuff)的选项,而不是class().dothis(dictkey, otherstuff)。下面是一个不工作的代码示例,它可以让您了解我的想法。在

class testclass:
    def __init__(self):
        self.dict = {'stuff':'value', 'stuff2':'value2'}

    #I know this part won't work, but it gives the general idea of what I'd like to do
    for key, value in self.dict.iteritems():
        def key():
            #do stuff
            return value

>>> testclass().stuff()
'value'

显然,每个键都需要检查它是否覆盖了任何重要的内容,但除此之外,如果可以工作的话,我将非常感谢您的帮助。在

基本上,我的脚本是将其他脚本存储在Maya场景文件的头中,因此您可以调用一个命令,它将执行匹配的脚本。它将脚本以文本格式存储在字典中,我在字典中做了一个类似于包装器的事情,这样你就可以输入arg和kwargs,而且因为你只能亲自输入和执行脚本,所以实际上没有任何恶意的危险,除非你自己这么做。在

列表是pickle和base64编码的,因为它的头都需要字符串格式,所以每次调用函数时,它都会解码字典以便您可以编辑或读取它,所以理想情况下,每次调用函数时我都需要构建函数。在

run函数中的几个示例:

^{pr2}$

因此,正如这个问题所问的,就上面的代码而言,我希望有类似SceneScript().MyScript( "test(10)" )的东西,只是为了让它更易于使用。在


Tags: 函数代码self脚本示例字典valuedef
3条回答

我将研究使用^{},与__getattribute__结合使用的部分函数:

class Foo:
    def __init__(self):
        self.a = 5
        self.b = 6

    def funca(self, x):
        print(self.a + x)

    def funcb(self, x):
        self.a += x
        self.funca(x)

mydict = {'funca':1, 'funcb':2}
foo = Foo()

for funcname,param in mydict.items():
    print('foo before:', foo.a, foo.b)
    print('calling', funcname)
    functools.partial(foo.__getattribute__(funcname), param)()
    print('foo after:', foo.a, foo.b)

输出:

^{pr2}$

我能想到的唯一正确的方法是:

class SomeClass(object):
    def __init__(self, *args, **kwargs):
        funcs = {'funcname': 'returnvalue', ...}
        for func, ret_val in funcs.iteritems():
            setattr(self, func, self.make_function(ret_val))

    @staticmethod
    def make_function(return_value):
        def wrapped_function(*args, **kwargs):
            # do some stuff
            return return_value
        return wrapped_function

这将允许您:

^{pr2}$

当然,你为什么想做这样的事,这个问题至今还没有答案:)

编辑每个更新的问题:

问题在于无法安全地将方法分配给函数签名。我不确定SceneScript().add目前是如何工作的,但这基本上必须与此相关。在

您是否正在寻找一种方法,通过一个带有名称的字符串来调用驻留在当前模块中的函数?如果是的话

def stuff(arg):
  return 5

d = {"stuff":"value","stuff2":"value2"}
print globals()["stuff"](d["stuff"])

将打印5。在

相关问题 更多 >