【问题标题】:Python equivalent to C++ __LINE__Python 等价于 C++ __LINE__
【发布时间】:2019-06-25 21:49:37
【问题描述】:

在 C++ 中调试的有用打印是

std::cout << __LINE__ << std::endl;

当然你可以简单地打印一个带有行号的字符串,例如:

std::cout << "this is line 54" << std::endl;

但是当你移动它时它不会不断改变行号。 Python中有没有等价的宏?

【问题讨论】:

  • @rkersh 你是对的,但是我认为这里的答案是最好的,所以不知道在这种情况下如何进行(我觉得关闭问题会删除有价值的知识)。也许接受答案的用户可以回答另一个问题,然后我可以压制这个

标签: python


【解决方案1】:

作为一个函数,所以你不必到处扩展它

import sys

def LINE():
    return sys._getframe(1).f_lineno


print('This is line', LINE())

TBH 我根本不明白inspect 模块的意义。

【讨论】:

  • inspect 模块旨在成为以门户方式访问有关 Python 对象信息的公共方式,例如,如果您需要 CPython 以外的 Python 实现(例如,PyPi、Jython 或 IronPython )。您不应明确使用_getframe,“CPython 实现细节:此函数应仅用于内部和专用目的。不保证在所有 Python 实现中都存在。”如果你使用检查,你可以保证它不仅仅适用于 CPython。使用 getframeinfo(currentframe()) 可以在任何地方使用,_getframe 可能会损坏。
【解决方案2】:

没有宏,但你可以做

from inspect import currentframe, getframeinfo

print(getframeinfo(currentframe()).lineno)

在 Python 中获取当前行号。

“当前行号”将是评估 currentframe() 的行,仅供参考。

【讨论】:

    【解决方案3】:

    我发现这个解决方案是最短的,这似乎不是特定于实现的:

    import inspect
    def __LINE__(): return inspect.stack()[1].lineno
    

    出于某种原因,我喜欢使用stack,因为它会返回一个列表。如果我需要更深入,我会使用stack()[&lt;n&gt;].frame。

    更新 我检查了性能! sys._getframe(1).f_lineno 更快!我没有打电话给我的__LINE__(),而是直接使用_getframe(1) 解决方案。如果调用1e6次,增益超过10分钟!

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 2011-11-25
      • 2011-03-02
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      相关资源
      最近更新 更多