15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

try:

return json.loads(data)

except ValueError:

return default

O problema com ela é o mesmo do exemplo anterior, datetime.now. O dicionário

especificado para o parâmetro default será compartilhado por todas as chamadas

a decode porque o valor default do argumento é calculado apenas uma vez (na

carga do módulo). Isso pode resultar em um comportamento extremamente

imprevisível.

foo = decode('bad data')

foo['stuff'] = 5

bar = decode('also bad')

bar['meep'] = 1

print('Foo:', foo)

print('Bar:', bar)

>>>

Foo: {'stuff': 5, 'meep': 1}

Bar: {'stuff': 5, 'meep': 1}

Pelo código acima, esperaríamos obter dois dicionários diferentes, cada um com

um único par chave:valor. Todavia, ao modificar um, o outro é também alterado.

O culpado é o fato de que foo e bar são iguais ao parâmetro default da função

decode. São, portanto, todos o mesmo objeto de dicionário.

assert foo is bar

O truque para que tudo funcione é definir o valor default do argumento como

None e documentar o comportamento esperado na docstring da função.

def decode(data, default=None):

"""Load JSON data from a string.

Args:

data: JSON data to decode.

default: Value to return if decoding fails.

Defaults to an empty dictionary.

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!