Python3:对函数进行链式调用

时间:2019-03-21 00:23:53

标签: 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:

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

2 个答案:

答案 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)))

当然。 内部函数的输出将被链接为外部函数的输入(只要它们的参数匹配)。 这是任何编程语言的基础。