2014-09-26 106 views
1

有沒有一種方法(最好使用ast模塊)知道函數是否具有所需數量的參數?例如,如果用戶界面允許用戶插入例如「sum(x)」的python表達式,但用戶錯誤地鍵入了「sum()」,是否有一種方法可以在運行時驗證該表達式?獲取Python函數所需的參數

我已經在符號樹的每個節點上都調用過ast.dump,但這些符號的信息似乎不足以用於這種分析?

例如:

#own debug code added to ast.py 
def visit(self, node): 
    print(dump(node),True, False) 
    method = 'visit_' + node.__class__.__name__ 
    visitor = getattr(self, method, self.generic_visit) 
    return visitor(node) 

產量:

'Module(body=[Expr(value=Call(func=Attribute(value=Name(id='Math', ctx=Load()), 
attr='cos', ctx=Load()), args=[Num(n=0.5)], 
keywords=[], starargs=None, kwargs=None))])' 

並不真正喜歡從打印()函數不需要的參數的具體數量不同。

+2

您必須解析被調用的對象並分析* that *。在你實際執行調用之前,Python不知道這個*。 – 2014-09-26 15:03:48

+0

如何爲Python函數定義「所需參數」?這個定義在哪裏? – 2014-09-26 15:03:54

+2

我不想命名你的模塊'ast.py'。 – roippi 2014-09-26 15:04:38

回答

0

您無法從調用表達式看到哪些參數可調用期望。 Python在運行時將其完全留給可調用的。

對於靜態代碼分析,唯一的選擇是解析可調用對象(希望它本質上不是太動態,例如在運行時會改變),對於C定義的對象有自己的簽名數據庫。這是Komodo CodeIntel圖書館採用的路線(OSS,用於其他項目,如SublimeCodeIntel)。 CIX files支持基於C的擴展,它基本上包含可調用簽名。

在運行時,您可以使用inspect.signature()來內省呼叫簽名。 C功能目前僅得到部分支持,只有那些使用參數診所的人才能存儲簽名信息,請參閱What are __signature__ and __text_signature__ used for in Python 3.4