Como depurar expressões e instruções digitadas manualmente no pdb?
No pdb (ou ipdb), podemos executar instruções e avaliar expressões com o!
oup
comandos:
expressão p
Avalie a expressão no contexto atual e imprima seu valor.
[!]declaração
Execute a instrução (uma linha) no contexto do quadro de pilha atual. O ponto de exclamação pode ser omitido, a menos que a primeira palavra da instrução seja semelhante a um comando debugger. Para definir uma variável global, você pode prefixar o comando de atribuição com um comando global na mesma linha
Então, por exemplo, eu posso digitarp reddit.get_subreddits()
durante a depuração no ipdb e o código será executado no contexto atual e verei o valor de retorno.
Existe uma maneira de depurar a execução dessas expressões "digitadas manualmente"?
Basicamente, eu gostaria de fazer és reddit.get_subreddits()
, mas isso apenas executa ostep
comando e ignora a expressão.
EDIT: Um exemplo trivial
Tome esta função simples:
import random
def get_value_for_weekday(weekday_index=None):
values = [10, 20, 20, 10, 30, 30, 30]
if not weekday_index:
# If no weekday provided, return the average of all weekdays
return sum(values) / 7
return averages[weekday_index]
if __name__ == '__main__':
while True:
import ipdb; ipdb.set_trace() # enter ipbd for debug
get_value_for_weekday(random.randint(0, 7))
Que está com problemas devido aoif not weekday_index
(deve verificarweekday_index is not None
.)
Vamos supor que eu note que recebo10
metade do número de vezes que eu esperava. Então eu adicionei umimport ipdb; ipdb.set_trace()
antes da chamada para a função para tentar depurar o código.
Então, eu estou no console do ipdb e de repente fico com a ideia de que talvez o problema seja quando eu passar 0 como weekday_index. Eu posso testar minha hipótese diretamente no ipdb:
ipdb> p get_value_for_weekday(0)
22
Ok, então eu percebo que há algo errado quandoweekday_index=0
.
O que eu gostaria de fazer agora é depurar passo a passo a chamada paraget_value_for_weekday(0)
, para que eu pudesse ver que eu entrei erradamente no bloco if.
Obviamente eu poderia sair do ipdb, parar o script, alterar o código para sempre passar 0, reiniciar o script e quando eu entrar no ipdb, depurar a chamada com o ipdbstep
(s
)
Mas não seria mais fácil se eu pudesse fazers get_value_for_weekday(0)
da mesma maneira que eu pude fazerp get_value_for_weekday(0)
?
Existe uma maneira de fazer algo assim?