Python 3.x Python3:对函数进行链式调用
这个问题可能毫无意义,只是对我来说很有趣,可能吗 在我的代码中,我有很多类似的检查和调用,比如:Python 3.x Python3:对函数进行链式调用,python-3.x,Python 3.x,这个问题可能毫无意义,只是对我来说很有趣,可能吗 在我的代码中,我有很多类似的检查和调用,比如: 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:
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
由于函数可以接收不同数量的参数,我可以重写所有函数,将
数组[]
作为单个参数。
我想用一本带有“key->function”的字典
我的问题是,我不明白在多个函数调用的情况下是否可以应用这种方法。
我也不知道,也不确定这种方法是否值得。
ps:在我的第三个案例中,有:
def submit_fast(task):
future = asyncio.run_coroutine_threadsafe(task, loop_fast)
def notify_found_discord_users(will_replace_with_array):
anything
如果你是说这样的话
def lower(x):
return x.lower()
def upper(x):
return x.upper()
a = "a string"
b = upper(lower(upper(a)))
当然。
内部函数的输出将链接为外部函数的输入(只要它们的参数匹配)。
它是任何编程语言的基础。您可以使用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"))
您的意思是self.COMMAND['foo'](self.COMMAND['bar'](self.id))
?您能否澄清first(second(arg))
与示例代码中的help
和find
函数的关系?您是否在问如何使用键列表,如[self.CMD\u HELP,self.CMD\u FIND]
,并希望组合这些函数?或者你想让合成的函数成为字典中的一个值(这样你就有了字典中的self.CMD\u FIRST\u SECOND:something
)?有一种更简单的方法可以做到这一点getattr(self,command)(self.id)
,但是command必须是一个方法的名称,很抱歉,我的第一个示例不清楚。补充说明。谢谢。我不知道python中的lambdas。总有新的东西。理论上,我可以将它们应用于我的需要。