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