получить пройденный путь до строки в питоне - PullRequest
0 голосов
/ 18 марта 2019

Учитывая функцию python с вложенными операторами if-else, как мы можем получить путь, который мы выбрали, чтобы попасть в строку.

def function():
   if condition1:
      if condition2:
         sth
      else:
         get_path()
   else:
      sth

В этом случае, когда функция function запускается,get_path() должен возвращать что-то вроде function.condition1.not(condition2)

Я не хочу сам строить путь, я думал об использовании модуля inspect и о том, что хранится в кадре стека, но я думаю, что этопотребуется некоторое лечение, чтобы получить путь.Есть ли более простой способ?

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Этот простой метод, удобный только для небольших путей и определяемый пользователем, не требует библиотеки. Вы можете создать список и добавить в этот список соответствующие теги для условий if (которые будут добавляться только в случае выполнения условия).в любое время вы можете распечатать список в порядке событий!

0 голосов
/ 18 марта 2019

Вы в основном хотите отследить, что произошло во время выполнения функции;Вы можете просто использовать trace ( подробнее здесь ), как показано ниже:

import sys
import trace

# create a Trace object, telling it what to ignore, and whether to
# do tracing or line-counting or both.
tracer = trace.Trace(
    ignoredirs=[sys.prefix, sys.exec_prefix],
    trace=0,
    count=1)

def test():
    if True:
        if False:
            print('one')
        else:
            print('two')

# run the new command using the given tracer
tracer.run('test()')

# make a report, placing output in the current directory
r = tracer.results()
r.write_results(show_missing=True, coverdir=".")

Вывод:

>>>>>> import sys
>>>>>> import trace

       # create a Trace object, telling it what to ignore, and whether to
       # do tracing or line-counting or both.
>>>>>> tracer = trace.Trace(
>>>>>>     ignoredirs=[sys.prefix, sys.exec_prefix],
>>>>>>     trace=0,
>>>>>>     count=1)

>>>>>> def test():
           if True:
               if False:
                   print('here')
               else:
    1:             print('here2')

       # run the new command using the given tracer
>>>>>> tracer.run('test()')

       # make a report, placing output in the current directory
>>>>>> r = tracer.results()
>>>>>> r.write_results(show_missing=True, coverdir=".")

Приведенное выше приведет к .coverфайл с результатами трассировки;или вам придется поиграться со строками и / или списком действий и использовать их в качестве выбранного пути.

Самый простой способ сделать это:

def function():
    path = 'function'

    if condition1:
        path += '.condition1'

        if condition2:
            path += '.condition2'
        else:
            path += '.not(condition2)'
    else:
        path += '.not(condition1)'

Это пример;он не способен масштабироваться, но удовлетворит крошечную потребность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...