[New-bugs-announce] [issue35960] dataclasses.field does not preserve empty metadata object

Christopher Hunt report at bugs.python.org
Sun Feb 10 20:06:54 EST 2019


New submission from Christopher Hunt <chrahunt at gmail.com>:

The metadata argument to dataclasses.field is not preserved in the resulting Field.metadata attribute if the argument is a mapping with length 0.

The docs for dataclasses.field state:

> metadata: This can be a mapping or None. None is treated as an empty dict. This value is wrapped in MappingProxyType() to make it read-only, and exposed on the Field object.

The docs for MappingProxyType() state:

> Read-only proxy of a mapping. It provides a dynamic view on the mapping’s entries, which means that when the mapping changes, the view reflects these changes.

I assumed that the mapping provided could be updated after class initialization and the changes would reflect in the field's metadata attribute. Indeed this is the case when the mapping is non-empty, but not when the mapping is initially empty.

For example:

    $ python
    Python 3.8.0a1+ (heads/master:9db56fb8fa, Feb 10 2019, 19:54:10)
    [GCC 7.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from dataclasses import field
    >>> d = {}
    >>> v = field(metadata=d)
    >>> d['i'] = 1
    >>> v.metadata
    mappingproxy({})
    >>> v = field(metadata=d)
    >>> v.metadata
    mappingproxy({'i': 1})
    >>> d['j'] = 2
    >>> v.metadata
    mappingproxy({'i': 1, 'j': 2})

In my case I have a LazyDict into which I was trying to save partial(callback, field). I could not have the field before it was initialized so I tried:

    d = {}
    member: T = field(metadata=d)
    d['key'] = partial(callback, field)

and it failed same as above.

As a workaround, one can set a dummy value in the mapping prior to calling dataclasses.field and then remove/overwrite it afterwards.

----------
components: Library (Lib)
messages: 335184
nosy: chrahunt
priority: normal
severity: normal
status: open
title: dataclasses.field does not preserve empty metadata object
type: behavior
versions: Python 3.7, Python 3.8

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue35960>
_______________________________________


More information about the New-bugs-announce mailing list