2017-10-17 86 views
0

我有一個關於上的MacBook預期類型 '{__name__}',得到了 '() - >無',而不是

我寫了一個函數我的Python(3.6)代碼或PyCharm IDE問題使用 「timeit」 測試其他功能花費的時間

def timeit_func(func_name, num_of_round=1): 
    print("start" + func_name.__name__ + "()") 
    str_setup = "from __main__ import " + func_name.__name__ 
    print('%s() spent %f s' % (func_name.__name__, 
          timeit.timeit(func_name.__name__ + "()", 
             setup=str_setup, 
             number=num_of_round))) 
    print(func_name.__name__ + "() finish") 

參數「func_name」只是一個需要測試的功能,並且已經被定義。 我調用這個函數的代碼

if __name__ == "__main__": 
    timeit_func(func_name=another_function) 

功能運作良好,但pycharm表明,此代碼「FUNC_NAME = another_function」的信息:

Expected type '{__name__}', got '() -> None' instead less... (⌃F1 ⌥T) 
This inspection detects type errors in function call expressions. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Types of function parameters can be specified in docstrings or in Python 3 function annotations 

我用Google搜索「預期類型'{}',得到了「() - >無」,但一無所獲helpful.I是Python的新。 我想問一下這是什麼意思?我該如何讓這些信息消失?因爲現在它突出了,讓我感到不舒服。

我通過import time使用它在Python3.6,這就是我在timeit模塊()(timeit.timeit()

def timeit(stmt="pass", setup="pass", timer=default_timer, number=default_number, globals=None): 
    """Convenience function to create Timer object and call timeit method.""" 
    return Timer(stmt, setup, timer, globals).timeit(number) 
+0

是什麼'timeit.timeit()'函數..? –

+0

這是一個衆所周知[問題](https://youtrack.jetbrains.com/issue/PY-21408),其功能不匹配對'{__name __}'型。 – user2235698

回答

0

你的參數func_name是嚴重命名的文檔中發現,因爲你是傳遞一個函數,而不是函數的名稱。這可能表明你的困惑的來源。

錯誤消息只說pycharm期待你傳遞一個對象與屬性__name__但它被賦予的功能來代替。函數具有該屬性,但它是內部細節的一部分,而不是您通常需要訪問的內容。

最簡單的解決方法是直接與職能工作。對於timeit文件是不是在這一點上是非常明確的,但實際上你可以給它一個函數(或任何可贖回),而不是一個字符串。所以,你的代碼可能是:

def timeit_func(func, num_of_round=1): 
    print("start" + func.__name__ + "()") 
    print('%s() spent %f s' % (func.__name__, 
          timeit.timeit(func, 
             number=num_of_round))) 
    print(func.__name__ + "() finish") 

if __name__ == "__main__": 
    timeit_func(func=another_function) 

這至少使得略少混亂的代碼作爲參數名稱現在相匹配的價值,而更好。我不使用pycharm,所以我不知道它是否仍然會警告,這可能取決於它是否知道timeit需要可調用。

應該擺脫錯誤的另一種方法是通過實際傳遞函數名,使代碼匹配的參數名:

def timeit_func(func_name, num_of_round=1): 
    print("start" + func_name + "()") 
    str_setup = "from __main__ import " + func_name 
    print('%s() spent %f s' % (func_name, 
          timeit.timeit(func_name + "()", 
             setup=str_setup, 
             number=num_of_round))) 
    print(func_name + "() finish") 

if __name__ == "__main__": 
    timeit_func(func_name=another_function.__name__) 

這樣做,你現在只能一次函數定義的缺點並且可以從主腳本中導入,而如果您真的將函數傳遞給timeit,則可以使用任何定義的函數。

相關問題