Las cadenas de comillas triples son una cadena grande. Nada se evalúa dentro de ellos. La parte %
es parte de la cadena. Tendría que tenerlo funcionando en la cadena real.
def func(animalType):
"""
This is a sample function.
@param animalType: "It takes one of these animal types %(ANIMAL_TYPES)s"
""" % {'ANIMAL_TYPES': ANIMAL_TYPES}
no estoy seguro de que esto va a funcionar correctamente, sin embargo; docstrings son un poco mágicos. Esto será no trabajo; la docstring se evalúa en tiempo de compilación (como la primera instrucción en la función, dado que es una cadena literal — una vez que tiene el %
, no es solo una cadena literal), el formateo de cadena se lleva a cabo en tiempo de ejecución, por lo que __doc__
estará vacío :
>>> def a(): 'docstring works'
...
>>> a.__doc__
'docstring works'
>>> def b(): "formatted docstring doesn't work %s" % ':-('
...
>>> b.__doc__
>>>
Si quisiera trabajar de esta manera, que había necesidad de hacer func.__doc__ %= {'ANIMAL_TYPES': ANIMAL_TYPES}
después de definir la función. Tenga en cuenta que esto se rompería en python -OO
si no verificó que se haya definido __doc__
, ya que -OO
elimina las cadenas de documentos.
>>> def c(): "formatted docstring works %s"
...
>>> c.__doc__
"formatted docstring works %s"
>>> c.__doc__ %= 'after'
>>> c.__doc__
"formatted docstring works after"
Esta no es la técnica estándar de todos modos; la técnica estándar es hacer referencia a la constante adecuada: "Toma uno de los tipos de animales en ANIMAL_TYPES", o similar.
Gracias, Chris. ¿Puedo preguntar por qué '__doc__' estará vacío en el código que taché? ¡Gracias! –
@JackZ: cubrió más ahora. –
La razón por la que está vacío es porque la ** expresión ** ''foo% s'% 'bar'' no es una cadena literal, es una expresión que se evaluaría como una cadena. El compilador espera que una cadena literal real, como la primera cosa dentro del bloque, califique como una docstring. –