装饰者将能够做你想做的事情以及更多。
装饰底漆
作为额外的奖励,装饰器在各种情况下都是非常有用的工具。他们真的没那么可怕。在本质上,它们是将函数作为参数并返回函数的函数。一个非常简单的示例打印调用的结果:
>>> def my_decorator(function):
... def inner_function(*args, **kwargs):
... res = function(*args, **kwargs)
... print("We have: "+res)
... return res
...
>>> @my_decorator
... def add(x, y):
... return x+y
...
>>> add(1,2)
We have: 3
3
这相当于
add = my_decorator(add)
对于您的问题,装饰器只需覆盖__doc__
函数的属性。
>>> def frenchmeup(fun):
... fun.__doc__ = "Bonjour, documentation!"
... return fun
...
>>> @frenchmeup
... def foo():
... """hello doc"""
... return "world"
...
>>> foo.__doc__
'Bonjour, documentation!'
将 args 传递给装饰器
如果您必须为每个函数创建一个装饰器,这将非常繁重。您可以使用文档字典轻松开发通用解决方案:
>>> ttable = {
... "FR" : {
... "hello doc": "Bonjour, documentation!"
... }
... }
>>> def document(lang=None):
... def doc_decorator(function):
... if lang and lang in ttable:
... function.__doc__ = ttable[lang][function.__doc__]
... return function
... return doc_decorator
...
>>> @document(lang="FR")
... def foo():
... """hello doc"""
... return 42
...
>>> foo.__doc__
'Bonjour, documentation!'
不是装饰器现在是如何由函数生成的。这更复杂,但使您能够将参数传递给装饰器。
作为个人说明,我花了一点时间才点击它,但我现在经常在我的 python 代码中使用它。
自动文档字符串翻译策略
您实际上可以通过检查模块中的文档字符串以编程方式生成文档字典。
从评论:
这个想法是字典是从您的文档字符串中自动生成的,然后传递给翻译器。如果您更改了规范(英语?)文档字符串,那么翻译也必须更改。通过将旧翻译表与新生成的表进行比较,您将能够重新插入规范文档字符串未更改的翻译。您只需添加新文档字符串的翻译。
因此,例如,在将文档字符串更改foo()
为您之后,"""goodbye, doc..."""
您将重新运行表生成器,您将获得一个新表,其中缺少旧的“hello doc”键,以及翻译表中的新键值对("goodbye, doc...", "")
。
替代使用help_<cmd>()
cmd 模块的样式
如果您更愿意使用cmdhelp_<cmd>()
模块的样式作为文档,您可以使用相同的原则,将翻译存储在字典中,并根据帮助命令中的 LANG 变量打印出正确的翻译。