2017-10-17 4 views
0

J'ai une question sur mon code ou PyCharm IDE sur MacBookType attendu '{__name__}', a '() -> Aucun' au lieu

j'ai écrit une fonction Python (3.6) en utilisant "timeit" pour tester le temps passé par d'autres fonctions

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") 
paramètre

« func_name » est juste un besoin de fonction à tester et a déjà été défini. et j'appelle cette fonction avec le code

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

la fonction fonctionne bien, mais PyCharm montrent l'info avec ce code "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 

J'ai googlé « type attendu '{nom}', got '() -> None "mais n'a rien d'utile.Je suis nouveau sur Python. Je veux demander ce que cela signifie? Et comment puis-je laisser cette information disparaître? parce que maintenant il est mis en évidence et laissez-moi me sentir mal à l'aise.

Je l'utilise dans Python3.6 par import time, ce que je trouve dans le doc du module 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

Qu'est-ce que la fonction 'timeit.timeit()' ..? –

+0

Il s'agit d'un [problème] connu (https://youtrack.jetbrains.com/issue/PY-21408) que les fonctions ne correspondent pas au type '{__name __}'. – user2235698

Répondre

0

Votre paramètre func_name est mal nommé parce que vous passez une fonction , pas le nom d'une fonction. Cela indique probablement la source de votre confusion. Le message d'erreur indique simplement que pycharm s'attend à ce que vous passiez un objet avec un attribut __name__ mais qu'une fonction lui ait été attribuée à la place. Les fonctions ont cet attribut mais cela fait partie du détail interne, et non quelque chose dont vous avez normalement besoin.

La solution la plus simple serait de travailler directement avec la fonction. La documentation pour timeit n'est pas très claire sur ce point, mais vous pouvez lui donner une fonction (ou n'importe quel callable) au lieu d'une chaîne. Donc, votre code pourrait être:

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) 

Ce au moins rend le code un peu moins confus que le nom du paramètre correspond maintenant à la valeur plutôt mieux. Je n'utilise pas pycharm donc je ne sais pas si cela va encore avertir, cela dépend probablement si elle sait que timeit prend un appelable.

Une alternative qui devrait se débarrasser de l'erreur serait de rendre le code correspondant à votre nom de paramètre en passant en fait un nom de fonction:

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__) 

Ceci a pour inconvénient que vous pouvez à présent uniquement de temps défini et importable à partir de votre script principal alors que si vous passez réellement la fonction à timeit, vous pouvez utiliser une fonction définie n'importe où.