使用带有哨兵对象的默认参数的 Sphinx python 方法进行记录?

发布于 2024-11-28 12:49:25 字数 515 浏览 1 评论 0原文

如果您希望能够允许人们使用 None 调用某些方法,您必须使用 sentinel 对象

 _sentinel = object()
 def foo(param1=_sentinel):
     ...

这将允许您调用 foo(param1=None) 并能够区分 foo() 等调用。

问题是,当 Sphinx 记录该方法时,它会编写类似“

mymodule.foo(param1=<object object at 0x108c1a520>)

我怎样才能说服 Sphinx 为这些函数提供用户友好的输出?”

之类的内容。请注意,想象一下,如果您使用哨兵方法有 3-4 个参数,文档会是什么样子。

If you want to be able to allow people to call some methods using None you have to do use a sentinel object when you define the method.

 _sentinel = object()
 def foo(param1=_sentinel):
     ...

This would allow you to call foo(param1=None) and be able to make the difference between a call like foo().

The problem is that when Sphinx does document the method it will write something like

mymodule.foo(param1=<object object at 0x108c1a520>)

How can I convince Sphinx to have a user friendly output for these functions?

Note, Imagine how the documentations look if you have 3-4 parameters using the sentinel approach.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梅倚清风 2024-12-05 12:49:26

生成的方法签名的 部分可以通过重写哨兵对象的 __repr__ 方法来更改。

_sentinel = type('_sentinel', (object,),
                 {'__repr__': lambda self: '_sentinel'})()

Sphinx 会将其渲染为如下所示:

mymodule.foo(param1=_sentinel)

The <object object at 0x108c1a520> part of generated method signature can be changed by overriding the __repr__ method of the sentinel object.

_sentinel = type('_sentinel', (object,),
                 {'__repr__': lambda self: '_sentinel'})()

It will be rendered by Sphinx as something like this:

mymodule.foo(param1=_sentinel)
白云不回头 2024-12-05 12:49:25

我认为只要你有一个在函数之外创建对象的哨兵,就不可能说服 Sphinx 变得更加“友好”。 Sphinx的autodoc扩展导入模块,这意味着执行模块级代码。

你确定你不能使用这样的东西吗?

def foo(param1=None):
    if param1 == None:
        param1 = whatever you want...
    else:
         ... 

I don't think it is possible to persuade Sphinx to be more "friendly" as long as you have a sentinel that creates an object outside the function. Sphinx' autodoc extension imports the module, which means that module-level code is executed.

Are you sure you can't use something like this?

def foo(param1=None):
    if param1 == None:
        param1 = whatever you want...
    else:
         ... 
我的黑色迷你裙 2024-12-05 12:49:25

这可以通过在 autodoc 指令中手动指定函数签名来处理,例如:

.. automodule:: pymorphy.contrib.tokenizers

    .. autofunction:: extract_tokens(foo, bar)

    .. autofunction:: extract_words

This can be handled by manually specifying function signature in autodoc directive, e.g.:

.. automodule:: pymorphy.contrib.tokenizers

    .. autofunction:: extract_tokens(foo, bar)

    .. autofunction:: extract_words
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文