gpt4 book ai didi

python - 在编译时提供函数元数据的大多数 Pythonic 方式?

转载 作者:太空狗 更新时间:2023-10-29 21:26:58 26 4
gpt4 key购买 nike

我正在以 Python 2.7 模块的形式构建一个非常基础的平台。该模块有一个读取-评估-打印循环,其中输入的用户命令被映射到函数调用。因为我试图让为我的平台构建插件模块变得容易,所以函数调用将从我的主模块到任意插件模块。我希望插件构建器能够指定他想要触发其功能的命令,所以我一直在寻找一种 Pythonic 方式来远程输入映射到主模块中的命令-> 函数字典中插件模块。

我看过几件事:

  1. 方法名解析:主模块导入插件模块并扫描它以查找与特定格式匹配的方法名称。为了例如,它可以将 download_file_command(file) 方法添加到它的字典为“下载文件”-> download_file_command。然而,得到一个简洁、易于输入的命令名称(比如“dl”)要求函数的名称也很短,这对代码不利可读性。它还要求插件开发人员符合精确的命名格式。

  2. 跨模块装饰器:装饰器会让插件开发人员可以随意命名他的函数,并且很简单添加类似 @Main.register("dl") 的内容,但它们必然要求我同时修改另一个模块的 namespace 并保留主模块中的全局状态。我知道这很糟糕。

  3. 同模块装饰器:使用与上面相同的逻辑,我可以添加一个装饰器,将函数的名称添加到某个命令名称->函数映射本地到插件模块并使用一个检索到主模块的映射API调用。这要求某些方法始终存在或虽然继承了,并且 - 如果我对装饰器的理解是正确的 - 该函数只会在第一次运行时注册自己,并且会在以后的每次不必要的时候重新注册自己此后。

因此,我真正需要的是一种 Pythonic 方式,用应该触发它的命令名称来注释函数,而且这种方式不能是函数的名称。当我导入模块时,我需要能够提取命令名称-> 函数映射,插件开发人员方面的工作减少是一个很大的优势。

感谢您的帮助,如果我对 Python 的理解有任何缺陷,我深表歉意;我对这门语言比较陌生。

最佳答案

构建或站在@ericstalbot 答案的第一部分,您可能会发现使用如下装饰器很方便。

################################################################################
import functools
def register(command_name):
def wrapped(fn):
@functools.wraps(fn)
def wrapped_f(*args, **kwargs):
return fn(*args, **kwargs)
wrapped_f.__doc__ += "(command=%s)" % command_name
wrapped_f.command_name = command_name
return wrapped_f
return wrapped
################################################################################
@register('cp')
def copy_all_the_files(*args, **kwargs):
"""Copy many files."""
print "copy_all_the_files:", args, kwargs
################################################################################

print "Command Name: ", copy_all_the_files.command_name
print "Docstring : ", copy_all_the_files.__doc__

copy_all_the_files("a", "b", keep=True)

运行时的输出:

Command Name:  cp
Docstring : Copy many files.(command=cp)
copy_all_the_files: ('a', 'b') {'keep': True}

关于python - 在编译时提供函数元数据的大多数 Pythonic 方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14829708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com