【问题标题】:Expected type '{__name__}', got '() -> None' instead预期类型 '{__name__}',得到 '() -> None'
【发布时间】:2018-03-28 20:48:26
【问题描述】:

我对 MacBook 上的 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 上搜索了“预期类型 '{name}',得到了 '() -> None”,但没有任何帮助。我是 Python 新手。 我想问一下是什么意思?我怎样才能让这些信息消失?因为现在它被突出显示,让我感到不舒服。

我在Python3.6 byimport time中使用它,这是我在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)

【问题讨论】:

  • 什么是timeit.timeit()函数..?
  • 已知issue 的函数与{__name__} 类型不匹配。

标签: macos python-3.x pycharm


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

【讨论】:

    猜你喜欢
    • 2018-06-16
    • 2019-10-16
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2014-03-11
    相关资源
    最近更新 更多