2017-10-17 10 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"は、テストする必要があり、既に定義されている関数です。

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で検索している: と私は機能がうまく動作しますが、このコード「FUNC_NAME = another_function」との情報がpycharm示し

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

コードでこの関数を呼び出します'{name}'は '() - > None'を取得しましたが、役に立たなかったのです。私はPythonの新機能です。 どういう意味ですか?そして、私はこの情報を消すことができますか?今は強調表示されていて、私に不快感を与えるからです。あなたはそれ機能渡しているので、私はimport timeでPython3.6でそれを使用する

が、これは私があなたのパラメータfunc_nameが悪いという名前です(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

関数が '{__name __}'型と一致しないことは既知の[issue](https://youtrack.jetbrains.com/issue/PY-21408)です。 – user2235698

答えて

0

はtimeitモジュール()のドキュメントで見つけたものです、関数の名前ではありません。これはおそらくあなたの混乱の原因を示します。

エラーメッセージは、単にpycharmが属性__name__を持つオブジェクトを渡すと予想していますが、代わりに関数が指定されているというエラーメッセージです。関数にはその属性がありますが、通常はアクセスする必要があるものではなく、内部の詳細の一部です。

最も簡単な解決策は、関数を直接使用することです。 timeitのドキュメントはこの時点ではあまり明確ではありませんが、実際には文字列ではなく関数(または呼び出し可能)を与えることができます。あなたのコードは次のようになります:

パラメータ名が値にかなり良く似ているので、少なくともコードをやや混乱させることはありません。私は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に渡すと、どこでも定義された関数を使うことができます。

関連する問題