我可以通过说来将功能存储在字典中
MyDict = {}
def func():
print("Hello, world!")
MyDict["func"] = func
我想知道是否有一种更干净/更整洁的方式来编写此代码-类似
MyDict = {}
def MyDict["func"]():
print("Hello, world!")
但是此代码引发语法错误
答案 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)重新考虑您的实际问题,因为您可能会找到其他解决方案除了将功能存储在字典中。