Рубрики
Без рубрики

Псевдонимы отладчика Python

Список псевдонимов для отладчика Python. Теги с Python, отладки, производительностью.

Привет всем! В этой записке я хотел бы собрать несколько полезных псевдонимов, которые вы можете использовать в Ваш .pdbrc Файл, который вы можете разместить в свою домашнюю папку или текущий режим.

Итак, начнем с Docstring PDB модуль :

The debugger supports aliases, which can save typing. And
aliases can have parameters (see the alias help entry) which
allows one a certain level of adaptability to the context
under examination.

Так что такое псевдоним после всего?

 alias [name [command]]

    Create an alias called _name_ that executes _command_. The 
command must not be enclosed in quotes. Replaceable 
parameters can be indicated by %1, %2, and so on, while %* is 
replaced by all the parameters. If no command is given, the 
current alias for name is shown. If no arguments are given, 
all aliases are listed.

    Aliases may be nested and can contain anything that can 
be legally typed at the pdb prompt. Note that internal pdb 
commands can be overridden by aliases. Such a command is then
 hidden until the alias is removed. Aliasing is recursively
 applied to the first word of the command line; all other 
words in the line are left alone.

Довольно просто, верно? Тем не менее, настолько мощный. Далее в документации мы можем увидеть два примера:

# Print instance variables (usage "pi classInst")
alias pi for k in %1.__dict__.keys(): print("%1.",k,,%1.__dict__[k])
# Print instance variables in self
alias ps pi self

Второй показывает, что псевдонимы могут быть Рекурсивно применяется к первому слову командной строки Это означает, что псевдоним PS PI self будет расширено дальше. Каждый псевдоним обрабатывается в PDB.Precmd Метод который принимает один аргумент – линия :

...
        args = line.split()
        while args[0] in self.aliases:
            line = self.aliases[args[0]]
...

Так что делает первый псевдоним? Давайте взглянем. Напишите какой-нибудь код, чтобы обеспечить контекст наши тесты.

class Spam():
    """Run Away! Run Away!"""
    def __init__(self, ham):
        self.ham = ham

    def egg(self):
        print(self.ham)


spam = Spam('ham')
spam.egg()

Запустите этот файл с помощью PDB3 Команда, см. (PDB) Подскажите и введите л который стоит список :

pdb3 /tmp/spam.py 
> /tmp/spam.py(1)()
-> class Spam():
(Pdb) l
  1  -> class Spam():
  2         """Run Away! Run Away!"""
  3         def __init__(self, ham):
  4             self.ham = ham
  5     
  6         def egg(self):
  7             print(self.ham)
  8     
  9     
 10     spam = Spam('ham')
 11     spam.egg()
(Pdb) 

Затем введите n Дважды, поэтому мы будем здесь:

(Pdb) l
  6         def egg(self):
  7             print(self.ham)
  8     
  9     
 10     spam = Spam('ham')
 11  -> spam.egg()
[EOF]
(Pdb) 

Теперь давайте создадим псевдоним:

(Pdb) alias for k in %1.__dict__.keys(): print("{}.{} = {}".format(%1, k, %1.__dict__[k]))

Это слегка изменилась версия псевдонимами из документации. Теперь давайте будем использовать это:

(Pdb) pi spam
<__main__.Spam object at 0x7effec0f3358>.ham = ham
(Pdb) 

Хм .. Не много … Давайте попробуем это:

(Pdb) pi Spam
.__module__ = __main__
.__doc__ = Run Away! Run Away!
.__init__ = 
.egg = 
.__dict__ = 
.__weakref__ = 

Да, намного лучше! Теперь давайте попробуем PS спам :

(Pdb) ps spam
*** NameError: name 'self' is not defined

Что у нас здесь – это использование псевдонимов из контекста. Давайте снова проверим псевдоним, чтобы обновить его в виду:

(Pdb) alias ps
ps = pi self

И Алиас Пи.

(Pdb) alias pi
pi = for k in %1.__dict__.keys(): print("{}.{} = {}".format(%1, k, %1.__dict__[k]))

Итак, PI Принимает один аргумент: % 1 и PS пытается пройти Я к этому псевдониму и терпят неудачу, потому что Я не в контексте. Давайте определим это и попробуй еще раз:

(Pdb) self = Spam
(Pdb) ps
.__module__ = __main__
.__doc__ = Run Away! Run Away!
.__init__ = 
.egg = 
.__dict__ = 
.__weakref__ = 

Мы изменяли немного здесь. Как описано в псевдонимы документации, рассматриваются как команды, набранные непосредственно в подсказке, означающее, что все необходимое Ингредиенты должны быть готовы переваривать. Вы можете лечить псевдонимы как функции, которые принимают n Переменные, которые будут взяты из Местные жители или глобали . И где переменная Я обычно определяется? В методах класса. Давайте перезапустим нашу сессию с помощью Перезапуск Команда (вы можете проверить все доступные команды, набрав Помощь в подсказке). Вам не нужно беспокоиться о потерянном прогрессе, потому что Перезапуск Справит все автоматически: все точки останова и определенные псевдонимы будут там на вашем обслуживании.

(Pdb) restart
Restarting /tmp/spam.py with arguments:
    /tmp/spam.py
> /tmp/spam.py(1)()
-> class Spam():
(Pdb) l
  1  -> class Spam():
  2         """Run Away! Run Away!"""
  3         def __init__(self, ham):
  4             self.ham = ham
  5     
  6         def egg(self):
  7             print(self.ham)
  8     
  9     
 10     spam = Spam('ham')
 11     spam.egg()
(Pdb) b 7
Breakpoint 1 at /tmp/spam.py:7
(Pdb) c
> /tmp/spam.py(7)egg()
-> print(self.ham)

Теперь давайте Перезапуск , Список кода, поставить точка останова на линии 7 и C Окончание исполнения. Мы в конечном итоге в строке 7, как мы должны. Давай проверим PS :

(Pdb) ps
<__main__.Spam object at 0x7fc94d49cef0>.ham = ham

Мы не получаем ошибки, потому что я уже определяется.

Это было короткое демонстрация использования псевдонимов в PDB.

Имейте в виду, что псевдонимы выполняются в текущем контексте, чтобы они могли беспорядок со своими переменными:

  6 B->     def egg(self):
  7             print(self.ham)
(Pdb) aaa=1
(Pdb) bbb=2
(Pdb) alias clutter aaa=bbb
(Pdb) locals()['aaa'], locals()['bbb']
(1,2)
(Pdb) clutter
(Pdb) locals()['aaa'], locals()['bbb']
(2,2)

После выполнения беспорядок Переменная псевдонима ААА получил новую ценность. Поэтому обязательно используйте имена переменных, которые являются уникальными, префикс их с ___ Например.

И у меня еще немного поделиться:

kf = __tmp = dir(%1); __filter = [k for k in __tmp if '%2' in k]; print(__filter); del __tmp; del __filter
pi = for k in %1.__dict__.keys(): print("{}.{} = {}".format(%1, k, %1.__dict__[k]))
ps = pi self
source = import inspect; print(inspect.getsource(%1))

Пожалуйста, поделитесь своими фрагментами, если у вас есть что-нибудь полезное, давайте учиться вместе. Отладка является довольно важным навыком для мастера, поэтому не стесняйтесь читать документацию на PDB и исходный код. Спасибо за чтение!

Оригинал: “https://dev.to/alexbender/python-debugger-aliases-38jc”