2017-10-17 70 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,则可以使用任何定义的函数。

相关问题