Как использовать inspect для получения многострочных операторов? - PullRequest
0 голосов
/ 15 апреля 2019

Я играю с inspect и хочу найти каждую строку в выражении, отправленном в функцию отладки, так что если у меня есть

dbg("hello"
    .replace("h", "H")
    .lower()
    .upper())

, я получу код, который был отправлен в dbg.Возможно ли это?

Вот функция, с которой я играл (из pydbg ):

"""pydbg is an implementation of the Rust2018 builtin `dbg` for Python."""

import inspect
import sys
import typing


__version__ = "0.3.0"


_ExpType = typing.TypeVar('_ExpType')


def dbg(exp: _ExpType) -> _ExpType:
    """Call dbg with any variable or expression.
    Calling debug will print out the content information (file, lineno) as wil as the
    passed expression and what the expression is equal to::
        from pydbg import dbg
        a = 2
        b = 5
        dbg(a+b)
        def square(x: int) -> int:
            return x * x
        dbg(square(a))
    """

    for frame in inspect.stack():
        line = frame.code_context[0]
        if "dbg" in line:
            start = line.find('(') + 1
            end =  line.rfind(')')
            if end == -1:
                end = len(line)
            print(
                f"[{frame.filename}:{frame.lineno}] {line[start:end]} = {exp!r}",
                file=sys.stderr,
            )
            break

    return exp

Я впервые пытаюсь проверить, и у меня естьне смог найти то что хочу.В настоящее время при использовании

from pydbg import dbg

dbg(a +
  1)

ничего не печатается.Все в dbg () должно быть в одной строке, чтобы это работало.

...