2017-10-17 2 views
0

Ich habe eine Frage zu meinem Python (3.6) Code oder PyCharm IDE auf MacBookErwartete Typ '{__name__}' erwartet, '() -> Keine' statt

Ich schrieb eine Funktion "timeit" zu testen Zeit durch andere Funktion

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

Parameter „func_name“ ausgegeben wird, nur eine Funktion müssen getestet werden und ist bereits definiert. und nenne ich diese Funktion mit dem Code

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

die Funktion gut funktioniert, aber PyCharm zeigt die Informationen mit diesem 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 

Ich habe gegoogelt „Expected Typ '{Name}', bekam '() -> None "aber nichts nützliches bekommen. Ich bin neu auf Python. Ich möchte fragen, was es bedeutet? Und wie kann ich diese Informationen verschwinden lassen? Denn jetzt ist es hervorgehoben und ich fühle mich unwohl.

ich es in Python3.6 von import time verwenden, das ist, was ich in der doc von timeit Modul() (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

Was ist 'timeeit.timeit()' Funktion ..? –

+0

Es ist ein bekanntes [Problem] (https://youtrack.jetbrains.com/issue/PY-21408), dass Funktionen nicht mit '{__name __}' Typ übereinstimmen. – user2235698

Antwort

0

Ihre Parameter func_name ist schlecht genannt gefunden, weil Sie es sind vorbei eine Funktion , nicht der Name einer Funktion. Dies deutet wahrscheinlich auf die Ursache Ihrer Verwirrung hin.

Die Fehlermeldung besagt einfach, dass pycharm erwartet, dass Sie ein Objekt mit einem Attribut __name__ übergeben, aber es wurde stattdessen eine Funktion zugewiesen. Funktionen haben dieses Attribut, aber es ist Teil des internen Details, nicht etwas, auf das normalerweise zugegriffen werden muss.

Die einfachste Lösung wäre, direkt mit der Funktion zu arbeiten. Die Dokumentation für timeit ist in diesem Punkt nicht sehr klar, aber Sie können ihm tatsächlich eine Funktion (oder irgendeine aufrufbare) statt einer Zeichenfolge geben. So könnte Ihr Code sein:

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) 

dass zumindest der Code macht etwas weniger verwirrend als der Parametername nun der Wert entspricht eher besser. Ich benutze keine pycharm, also weiß ich nicht, ob es noch warnen wird, das hängt wohl davon ab, ob es weiß, dass timeit eine abrufbare nimmt.

Eine Alternative, die den Code entspricht Ihre Parameternamen, indem sie tatsächlich vorbei in einem Funktionsnamen des Fehlers zu befreien wäre bekommen sollte:

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

Dies hat den Nachteil, dass Sie können jetzt nur Zeitfunktionen definiert und wenn Sie die Funktion an timeit übergeben, können Sie eine Funktion verwenden, die irgendwo definiert ist.

Verwandte Themen