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?

questionAnswers(2)

yourAnswerToTheQuestion