Python中字典中的函数

时间:2018-06-26 21:57:55

标签: python function dictionary syntax

我可以通过说来将功能存储在字典中

MyDict = {}

def func():
    print("Hello, world!")

MyDict["func"] = func

我想知道是否有一种更干净/更整洁的方式来编写此代码-类似

MyDict = {}

def MyDict["func"]():
    print("Hello, world!")

但是此代码引发语法错误

4 个答案:

答案 0 :(得分:4)

您可以(ab)使用装饰器。

MyDict = {}

def store(d, name):
    def _(f):
        d[name] = f
        return f
    return _

@store(MyDict, "func")
def func():
    print("Hello, world!")

@store(MyDict, "foo")
def some_other_func():
    print("Goodbye")

如果您只想使用定义的名称作为键并硬编码要更新的字典,则可以简化此操作:

def store(f):
    MyDict[f.__name__] = f
    return f

@store
def func():
    print("Hello, world!")

答案 1 :(得分:2)

对于您的示例,您可以执行以下操作:

d = {}
d['func'] = lambda: print('Hello, world!')
d['func']()
>>> 'Hello, world!'

如果要使用课程:

class MyClass:
    def func(self):
        print('Hello, world!')

c = MyClass()
c.func()
>>> 'Hello, world!'

答案 2 :(得分:1)

这是错误的:

def MyDict["func"]():
    print("Hello, world!")

因为在def之后,您需要使用仅包含allowed characters的单词。这就是为什么出现语法错误。

您可以使用的是:

1)Lambda函数(由@bphi建议)

MyDict = {}
MyDict['func'] = lambda: print("123")
MyDict['func']()

2)Python class通过内置函数setattr动态创建存储在MyDict中的方法(在类内部):

def func1():
    print(1)


def func2():
    print(2)


MyDict = {}
MyDict['func1'] = func1
MyDict['func2'] = func2

class MyClass3:
    def __init__(self):
        for name, obj in MyDict.items():
            setattr(self, name, obj)

obj = MyClass3()
obj.func1()
obj.func2()

或通过lambda:

MyDict = {}
MyDict['func1'] = lambda : print(1)
MyDict['func2'] = lambda : print(2)

class MyClass3:
    def __init__(self):
        for name, obj in MyDict.items():
            setattr(self, name, obj)

obj = MyClass3()
obj.func1()
obj.func2()

class MyClass3:
    MyDict = {}
    MyDict['func1'] = lambda: print(1)
    MyDict['func2'] = lambda: print(2)

    def __init__(self):
        for name, obj in self.MyDict.items():
            setattr(self, name, obj)

obj = MyClass3()
obj.func1()
obj.func2()

答案 3 :(得分:0)

如果您可以将所有功能表达为单行,请按照@bphi's answer中的建议使用`${expression}`

如果您不希望通过使用lambda演算来受到限制,则另一种方法是使用类及其静态方法。静态方法是类的方法,而不是类的实例,因此它们无权访问对象的内部状态,并且可以在类(而不是实例)上调用。

但是,通过阅读此答案,即使结果恰好是您所要求的,您也可能会发现为什么这不是一种非常优雅(或推荐)的方法。

key

如果您要使用问题中建议的字典语法,则可以在类上使用lambda

class MyClass:
    @staticmethod # this decorator is optional here, but suggested for code clarity
    def func():
        print("Hello, world!")

    def func2():
        print("Hey there, I am another function.")

MyClass.func()
>>> 'Hello, world!'
MyClass.func()
>>> 'Hey there, I am another function.'

您还可以在该字典中添加其他功能:

__dict__

但是由于此字典只是类MyDict = dict(MyClass.__dict__) MyDict["func"]() >>> 'Hello, world!' MyDict["func2"]() >>> 'Hey there, I am another function.' 的表示形式,因此它还包含与该类相关的某些项目,例如MyDict["func3"] = lambda: print("Hi, I am yet another function.") def func4: print("And I am the last function for today.") MyDict["func4"] = func4 MyDict["func"]() >>> 'Hi, I am yet another function.' MyDict["func2"]() >>> 'And I am the last function for today.' 。但是您可以提取自己的函数:

MyClass

结果正是您所要的,但是我怀疑这种方法的复杂性是否值得。我建议a)使用__weakref__函数,b)坚持第一种方法(先定义函数,然后将其放入MyCleanDict = {} for key, value in MyDict: if not key.startswith("_"): MyCleanDict[key] = value ),或c)重新考虑您的实际问题,因为您可能会找到其他解决方案除了将功能存储在字典中。