预期类型' {__ name __}',得到'() - >无'代替

时间:2017-10-17 08:09:44

标签: macos python-3.x pycharm

我对我的Python(3.6)代码或MacBook上的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

我用谷歌搜索了#34;预期类型' {名称}',得到'() - >无"但没有任何帮助。我是Python的新手。 我想问一下这意味着什么?我怎样才能让这些信息消失?因为现在它突出显示,让我感到不舒服。

我在{3} import time的Python3.6中使用它,这是我在timeit module()(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)

1 个答案:

答案 0 :(得分:1)

您的参数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,则可以使用在任何地方定义的函数。