2014-12-03 65 views
1

我可以在python中做到這一點,它給了我函數內可用的子模塊/參數。探測python函數

在解釋,我可以這樣做:

>>> from nltk import pos_tag 
>>> dir(pos_tag) 
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name'] 

順便說一句,什麼是dir(function)電話嗎?

如何知道調用函數需要哪些參數?例如在pos_tag的情況下,源代碼的說,它需要token,看到https://github.com/nltk/nltk/blob/develop/nltk/tag/init.py

def pos_tag(tokens): 
    """ 
    Use NLTK's currently recommended part of speech tagger to 
    tag the given list of tokens. 
     >>> from nltk.tag import pos_tag # doctest: +SKIP 
     >>> from nltk.tokenize import word_tokenize # doctest: +SKIP 
     >>> pos_tag(word_tokenize("John's big idea isn't all that bad.")) # doctest: +SKIP 
     [('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 
     'VBZ'), ("n't", 'RB'), ('all', 'DT'), ('that', 'DT'), ('bad', 'JJ'), 
     ('.', '.')] 
    :param tokens: Sequence of tokens to be tagged 
    :type tokens: list(str) 
    :return: The tagged tokens 
    :rtype: list(tuple(str, str)) 
    """ 
    tagger = load(_POS_TAGGER) 
    return tagger.tag(tokens) 

如果文檔字符串可用於功能是有沒有辦法知道什麼是參數類型的函數需要一個具體參數?,例如在pos_tag以上的案例中,它的編號爲:param tokens: Sequence of tokens to be tagged:type tokens: list(str)運行解釋器時未讀取代碼就可以獲取這些信息嗎?

最後,有沒有辦法知道什麼是返回類型?

只是要清楚,我不期待的文檔字符串的打印輸出,但上面的問題是,這樣我可以做某種類型與isinstance(output_object, type)

回答

2

下面後來檢查是回答你的四個問題。恐怕你想做的一些事情在標準庫中是不可能的,除非你想自己解析文檔。

(1)順便說一下,什麼是目錄(函數)調用?

如果我沒有理解這個問題,我相信文檔回答這個問題here

如果對象有一個名爲__dir__()方法,這個方法會被稱爲 並且必須返回列表屬性。這允許 實現定製__getattr__()__getattribute__()函數的對象 定製dir()報告它們的屬性的方式。

如果對象不提供__dir__(),該函數試圖從對象的__dict__屬性最好 收集信息,如果 定義,並從其類型的對象。

(2)如何知道調用函數需要哪些參數?

最好的辦法是使用inspect

>>> from nltk import pos_tag 
>>> from inspect import getargspec 
>>> getargspec(pos_tag) 
ArgSpec(args=['tokens'], varargs=None, keywords=None, defaults=None) # a named tuple 
>>> getargspec(pos_tag).args 
['tokens'] 

(3)如果文檔字符串可用於功能是有辦法 知道什麼是參數類型的函數期望爲一個 特定參數?

不在標準庫中,除非你想自己解析文檔字符串。你可能已經知道,你可以訪問這樣的文檔字符串:

>>> from inspect import getdoc 
>>> print getdoc(pos_tag) 
Use NLTK's currently recommended part of speech tagger to 
tag the given list of tokens. 

    >>> from nltk.tag import pos_tag 
    >>> from nltk.tokenize import word_tokenize 
    >>> pos_tag(word_tokenize("John's big idea isn't all that bad.")) 
    [('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 
    'VBZ'), ("n't", 'RB'), ('all', 'DT'), ('that', 'DT'), ('bad', 'JJ'), 
    ('.', '.')] 

:param tokens: Sequence of tokens to be tagged 
:type tokens: list(str) 
:return: The tagged tokens 
:rtype: list(tuple(str, str)) 

或本:

>>> print pos_tag.func_code.co_consts[0] 

    Use NLTK's currently recommended part of speech tagger to 
    tag the given list of tokens. 

     >>> from nltk.tag import pos_tag 
     >>> from nltk.tokenize import word_tokenize 
     >>> pos_tag(word_tokenize("John's big idea isn't all that bad.")) 
     [('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 
     'VBZ'), ("n't", 'RB'), ('all', 'DT'), ('that', 'DT'), ('bad', 'JJ'), 
     ('.', '.')] 

    :param tokens: Sequence of tokens to be tagged 
    :type tokens: list(str) 
    :return: The tagged tokens 
    :rtype: list(tuple(str, str)) 

如果你想嘗試分析自己的PARAMS和「類型」,您可以用啓動一個正則表達式。顯然,我使用的是「類型」這個詞。此外,這種方法將只用於列出其參數和類型在這種特定的方式工作文檔字符串:當然

>>> import re 
>>> params = re.findall(r'(?<=:)type\s+([\w]+):\s*(.*?)(?=\n|$)', getdoc(pos_tag)) 
>>> for param, type_ in params: 
    print param, '=>', type_ 

tokens => list(str) 

這種做法的結果會給你PARAMS及其相應的說明。您也可以通過分割字符串,只保留那些符合以下要求的話檢查的描述中的每個字:

>>> isinstance(eval(word), type) 
True 
>>> isinstance(eval('list'), type) 
True 

但是,這種方法可能會很快變得複雜,試圖解析的pos_tag最後一個參數時尤其如此。而且,docstrings通常不會有這種格式。所以這可能只適用於nltk,但即使不是所有的時間。

(4)最後,有沒有辦法知道什麼是返回類型?

再次,恐怕不是,除非你想使用上面的正則表達式來梳理文檔字符串。返回類型可能會根據arg(s)類型的不同而有所不同。 (考慮到將與任何可迭代工作的任何功能。)如果你想嘗試(再次,在pos_tag文檔字符串的精確格式)提取文檔字符串此信息,您可以嘗試另一個正則表達式:

>>> return_ = re.search(r'(?<=:)rtype:\s*(.*?)(?=\n|$)', getdoc(pos_tag)) 
>>> if return_: 
    print 'return "type" =', return_.group() 

return "type" = rtype: list(tuple(str, str)) 

否則,我們在這裏可以做的最好的辦法是獲得源代碼(這又是明確的你不想要的):

>>> import inspect 
>>> print inspect.getsource(pos_tag) 
def pos_tag(tokens): 
    """ 
    Use NLTK's currently recommended part of speech tagger to 
    tag the given list of tokens. 

     >>> from nltk.tag import pos_tag 
     >>> from nltk.tokenize import word_tokenize 
     >>> pos_tag(word_tokenize("John's big idea isn't all that bad.")) 
     [('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 
     'VBZ'), ("n't", 'RB'), ('all', 'DT'), ('that', 'DT'), ('bad', 'JJ'), 
     ('.', '.')] 

    :param tokens: Sequence of tokens to be tagged 
    :type tokens: list(str) 
    :return: The tagged tokens 
    :rtype: list(tuple(str, str)) 
    """ 
    tagger = load(_POS_TAGGER) 
    return tagger.tag(tokens) 
+0

很好的答案!!!! – alvas 2014-12-03 13:27:43

+0

@alvas你問很好的問題!我愛你如何深入挖掘nltk。 – 2014-12-03 13:51:44