这个问题可能是毫无意义的,对我来说很有趣,是否可能没有。
在我的代码中,我有很多类似的检查和调用,例如:
if self.command == self.CMD_HELP:
help(self.id)
if self.command == self.CMD_FIND:
find(self.id)
...
我发现理论上可以做到:
self.COMMANDS = {
'help': help,
'find': find,
...
}
And execution:
self.COMMANDS[command](self.id)
我可以调用一个函数很好。
但是,如果我需要调用类似first(second(arg))
的东西怎么办?
更新:
抱歉,我的初始描述不太清楚。
所有这些都是关于当前实现的重构:
if command == MessageSettings.MSG_GLOBAL_HELP:
notify_help(guid)
if command == MessageSettings.MSG_GLOBAL_DISCORD:
sv_async.submit_fast(sv_discord.notify_discord_help(guid))
if command == MessageSettings.MSG_GLOBAL_FIND:
sv_async.submit_fast(sv_discord.notify_found_discord_users(guid, param))
... a lot of other 'ifs'
同时我必须支持值列表以进行比较:
class MessageSettings:
MSG_GLOBAL_HELP = 'help'
MSG_GLOBAL_DISCORD = 'discord'
MSG_GLOBAL_FIND = 'find'
...
MSG_VALUES = [
MSG_GLOBAL_HELP,
MSG_GLOBAL_DISCORD,
MSG_GLOBAL_FIND,
...
]
在这种情况下,如果我添加新选项,则必须修改3个位置:类中的新字段,将其添加到数组中,添加if == value -> function
的比较和执行。
由于函数可以接收不同数量的参数,因此我可以重写所有函数以将array []
用作单一参数。
我想到了将字典与"key -> function"
一起使用。
我的问题是,我不了解在调用多个函数的情况下是否可以将这种方法应用。
我也不知道,我不确定这种方法是否值得。
ps:在我的第3种情况下,有:
def submit_fast(task):
future = asyncio.run_coroutine_threadsafe(task, loop_fast)
def notify_found_discord_users(will_replace_with_array):
anything
答案 0 :(得分:1)
您可以按以下方式使用lamda:
def help (n):
return "help " + n + " "
def find (n):
return "find " + n + " "
COMMANDS = {
'help': help,
'find': find,
'other' : (lambda x: help(x) + find(x))
}
print (COMMANDS['other']("Joe"))
答案 1 :(得分:0)
如果您这样说,
def lower(x):
return x.lower()
def upper(x):
return x.upper()
a = "a string"
b = upper(lower(upper(a)))
当然。 内部函数的输出将被链接为外部函数的输入(只要它们的参数匹配)。 这是任何编程语言的基础。