Subcontratar locals () en una comprensión de dictado falla con KeyError

Me ha desconcertado un extraño comportamiento de los locals() de Python locals() .
Básicamente quiero obtener un artículo del diccionario de locals() en una comprensión de diccionario, pero falla. Es una cosa extremadamente básica, así que:

 >>> foo=123 >>> bar=345 >>> baz=678 >>> {k: locals()[k] for k in ('foo','bar','baz')} Traceback (most recent call last): File "", line 1, in  File "", line 1, in  KeyError: 'foo' >>> locals()['foo'] 123 >>> locale=locals() >>> {k: locale[k] for k in ('foo','bar','baz')} {'foo': 123, 'bar': 345, 'baz': 678} >>> type(locals())  >>> def fun(): ... return {'foo': 123,'bar':345} ... >>> {k: fun()[k] for k in ('foo','bar')} {'foo': 123, 'bar': 345} 

En un lado práctico, el más feo {'foo':foo, 'bar': bar} etc. en dict o en cadena .format() funciona bien.
Es solo que me estoy perdiendo algo, así que saber por qué boostá mi chi de encoding (a partir de ahora no me ilumino al codificar).

Debido a que todas las comprensiones en Python 3 se implementan mediante una función oculta, llamar a los locals no devuelve los valores que espera que regrese.

Puedes ver esto imprimiendo los valores:

 >>> _ = {k: print(locals()) for k in ('foo','bar','baz')} {'k': 'foo', '.0': } {'k': 'bar', '.0': } {'k': 'baz', '.0': } 

Asignar locals() a la locale , como lo hace, se encarga de esto. No estás llamando a los locals dentro de la comprensión.


Tenga en cuenta que, en Python 2, la situación es un poco más turbia. dict-comps fallan de una manera similar pero las comstackciones de listas, que son anteriores a las comp-dict, funcionan bien:

 >>> _ = [locals()[k] for k in ('foo', 'bar', 'baz')] >>> _ [20, 40, 60] 

esta es otra ‘verruga’ que fue dirigida con Py3.