71

だから私は次のような「動的な」docstringを作成しようとしています:

ANIMAL_TYPES = ["mammals", "reptiles", "other"]

def func(animalType):
""" This is a sample function.

    @param animalType: "It takes one of these animal types %s" % ANIMAL_TYPES
"""

基本的に、docstringに@param animalTypeANIMAL_TYPESがあるかを表示させます。この変数が更新されると、docstringが自動的に更新されるようにします。

残念ながら、うまくいかないようです。これを達成する方法があるかどうか誰かが知っていますか?

4

4 に答える 4

64

これを行う1つの方法は、デコレータを使用することです。これについてどう思うかわかりません。私は実際にこの方法についての解説を検索し、この答えを見つけました。これは、設計上の問題を隠す可能性があることを正しく示しています。しかし、あなたのユースケースは一見私には聞こえます。

いずれにせよ、あなたが探している結果を達成するためのかなりエレガントな方法は次のとおりです。

>>> def docstring_parameter(*sub):
...     def dec(obj):
...         obj.__doc__ = obj.__doc__.format(*sub)
...         return obj
...     return dec
... 
>>> @docstring_parameter('Ocean')
... def foo():
...     '''My Docstring Lies Over The {0}'''
...     pass
... 
>>> @docstring_parameter('Sea')
... def bar():
...     '''My Docstring Lies Over The {0}'''
...     pass
... 
>>> @docstring_parameter('Docstring', 'Me')
... def baz():
...     '''Oh Bring Back My {0} To {1}'''
...     pass
... 
>>> foo.__doc__
'My Docstring Lies Over The Ocean'
>>> bar.__doc__
'My Docstring Lies Over The Sea'
>>> foo.__doc__
'My Docstring Lies Over The Ocean'
>>> baz.__doc__
'Oh Bring Back My Docstring To Me'
于 2012-04-25T01:54:23.307 に答える
22

トリプルクォートされた文字列は1つの大きな文字列です。それらの内部では何も評価されません。%パーツはすべて文字列の一部です。実際の文字列で動作させる必要があります。

def func(animalType):
    """
    This is a sample function.

    @param animalType: "It takes one of these animal types %(ANIMAL_TYPES)s"
    """ % {'ANIMAL_TYPES': ANIMAL_TYPES}

ただし、これが正しく機能するかどうかはわかりません。docstringは少し魔法です。 これは機能しません。docstringはコンパイル時に評価され(関数の最初のステートメントとして、文字列リテラルである場合%、文字列リテラルだけではありません)、文字列のフォーマットは実行時に行わ__doc__れるため、空になります。

>>> def a(): 'docstring works'
... 
>>> a.__doc__
'docstring works'
>>> def b(): "formatted docstring doesn't work %s" % ':-('
... 
>>> b.__doc__
>>> 

このように作業したい場合はfunc.__doc__ %= {'ANIMAL_TYPES': ANIMAL_TYPES}、関数を定義した後で行う必要があります。ストリップdocstringとして定義されpython -OOていることを確認しなかった場合、これが中断することに注意してください。__doc__-OO

>>> def c(): "formatted docstring works %s"
... 
>>> c.__doc__
"formatted docstring works %s"
>>> c.__doc__ %= 'after'
>>> c.__doc__
"formatted docstring works after"

これはとにかく標準的な手法ではありません。標準的な手法は、適切な定数「ANIMAL_TYPESの動物タイプの1つを取る」などを参照することです。

于 2012-04-25T00:13:20.773 に答える
9

を使用してdocstringを定義することもできます.__doc__

例えば:

>>> def f():
      pass
>>> x = 1
>>> y = "docstring"

>>> f.__doc__ = "%s string %s" % (x, y)
>>> print(f.__doc__)
1 string docstring
于 2012-04-25T00:20:57.163 に答える
2

docstringで相互参照を使用するだけで、変数を参照できます。

それで:

:param animalType: It takes one of these :data:`animal types<ANIMAL_TYPES>`

そして2番目に:

:param choice: can be one of :attr:`MY_CONST`
于 2012-12-14T13:32:57.480 に答える