2012-01-05 52 views
3

我想用狮身人面像证明我的Python代码,但我发现一个问题记录一些数据与exec实例化;我有一个需要实例化的名称和值的表。狮身人面像 - 自动数据显示str .__ doc__

所以在我的代码,我写的是这样的:

my_vars = [{'name': 'var1', 'value': 'first'}, 
      {'name': 'var2', 'value': 'second'}] 

for var in my_vars: 
    exec("{var[name]} = '{var[value]}'".format(var=var)) 

问题是与狮身人面像:因为我想保持我只是用autodata的源代码,从我.rst文件corrisponding线路有:

.. autodata:: mymodule.var1 

.. autodata:: mymodule.var2 

所建立起来的时候给了我这个:

mymodule.var1 = 'first' 
    str(string[, encoding[, errors]]) -> str 

    Create a new string object from the given encoded string. 
    encoding defaults to the current default string encoding. 
    errors can be ‘strict’, ‘replace’ or ‘ignore’ and defaults to ‘strict’. 

mymodule.var2 = 'second' 
    str(string[, encoding[, errors]]) -> str 

    Create a new string object from the given encoded string. 
    encoding defaults to the current default string encoding. 
    errors can be ‘strict’, ‘replace’ or ‘ignore’ and defaults to ‘strict’. 

我认为自动数据会查看var1.__doc__作为文档字符串,并且发现str.__doc__(即前面显示的消息)。

我真的不知道该怎么做,我正在寻找一种不显示丑陋的doc字符串(但仍然保持mymodule.var1 = 'first')的方法。

或者甚至更好的方式来显示我自己的文档,如:var1 is this.(但我不知道该把它放在哪里)。

回答

2

我的建议是这样的:在模块文档字符串,而不是试图从autodata有用的东西记录的变量。

mymodule.py:

""" 
This module is... 

Module variables: 

* var1: var1 doc 
* var2: var2 doc 
""" 

my_vars = [{'name': 'var1', 'value': 'first'}, 
      {'name': 'var2', 'value': 'second'}] 

for var in my_vars: 
    exec("{var[name]} = '{var[value]}'".format(var=var)) 

... 
... 

您还可以使用info fields

""" 

:var var1: var1 doc 
:var var2: var2 doc 
""" 

这工作,排序的,但不是很好地格式化输出作为信息字段用来记录类变量或功能参数。


更新:跟进关于str子类的评论。这对你有用吗?

from collections import UserString 

my_vars = [{'name': 'var1', 'value': 'first', "doc": "var1 docstring"}, 
      {'name': 'var2', 'value': 'second', "doc": "var2 docstring"}] 

for var in my_vars: 
    code = """\ 
{0} = UserString('{1}') 
{0}.__doc__ = '{2}'""".format(var["name"], var["value"], var["doc"]) 
    exec(code) 
+0

这看起来不错,但是您认为那里可能是一种将doc字符串放入my_vars的方法, 可能类似于:'{'name':'var1','value':'first','doc':'var1 doc'}' 然后提取该文档串? – 2012-01-07 14:09:43

+0

我在设置变量的'__doc__'属性时尝试了一些尝试,但是我无法使它工作。我收到关于'__doc__'的错误消息,因为它是只读的(因为字符串是不可变的,我猜)。 – mzjn 2012-01-07 14:27:44

+0

您认为将str继承到exec来覆盖'__doc__'可能是一个好主意吗?我只是试过了,它适用于文档,但是我的'var'不再是'str'(因为它们将会是内部包中的常量,我不知道它是否是一个好主意),你是什么认为? – 2012-01-07 14:53:46

0

鉴于在这种情况下,是很难让sphinx.ext.autodoc产生,因为所需的文档字符串:

  • 的代码通过exec
  • 评估值可能不会让你覆盖文档字符串

您是否考虑对rst文档本身的文档进行硬编码?

.. data:: mymodule.var1 

    var1 is this 

.. data:: mymodule.var2 

    var2 is that 
+0

是的,当然这是一种方式,但我真正想要的是在源代码中编写文档字符串,然后找到一种方法将它放入我的第一个 – 2012-01-07 14:06:00

0

我意识到如何解决它。 写水木清华这样的:

 
x = 55 
""" 
x is varibble lala 
""" 

使用automodule指令和狮身人面像将文档为您服务。

+1

对不起,但事实并非如此。这些变量不在模块级别,而是作为字符串存储在一个字典中(这是因为它具有稳定性和与旧设计的兼容性,无论如何这不是讨论的问题)。这意味着这些变量在模块级别与'exec'一起使用,这会扰乱sphinx读取的doc属性。我希望已经清楚了这个问题到底是什么。 – 2012-06-10 08:14:31

+0

对不起,我误解了。 – Stan 2012-06-11 03:06:22