[Python-ideas] namedtuple fields with default values
Guido van Rossum
guido at python.org
Fri Jul 17 18:59:21 CEST 2015
FWIW, PEP 484 (and hence typing.py) uses this syntax with a different
* NamedTuple, used as
``NamedTuple(type_name, [(field_name, field_type), ...])``
and equivalent to
``collections.namedtuple(type_name, [field_name, ...])``.
This is useful to declare the types of the fields of a a named tuple
On Fri, Jul 17, 2015 at 4:59 PM, Eric V. Smith <eric at trueblade.com> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> On 07/17/2015 10:44 AM, Barry Warsaw wrote:
> > On Jul 16, 2015, at 01:03 PM, Russell Kaplan wrote:
> >> I'm using a namedtuple to keep track of several fields, only
> >> some of which ever need to be specified during instantiation.
> >> However, there is no Pythonic way to create a namedtuple with
> >> fields that have default values.
> > I don't know about "Pythonic" but there's a not too horrible way
> > to do it:
> > _Record = namedtuple('Record', 'url destination checksum')('', '',
> > '')
> > def Record(url, destination, checksum=''): return _Record._replace(
> > url=url, destination=destination, checksum=checksum)
> > Now you only need to provide 'url', and 'destination' when you
> > create a Record. Okay, sure _Record is the actual namedtuple, but
> > I usually don't care.
> >> Having to assign to Foo.__new__.__defaults__ is a bit ugly. I
> >> think it would be easier and more readable to support syntax
> >> like:
> >>>>> Foo = namedtuple('Foo', ['optional_bar=None',
> >>>>> 'optional_baz=None'])
> > That would mean you couldn't ever have an actual parameter called
> > 'optional_bar'.
> >> This suggestion is fully backwards compatible and allows for
> >> cleaner definitions of nametuples with default-value fields.
> >> Thanks for considering.
> > Not that I think anything really needs to be done, but a few other
> > approaches could be:
> > * Allow for arbitrary keyword arguments at the end of the
> > signature to define default values.
> > Record = namedtuple('Record', 'url destination checksum',
> > checksum='')
> > * Extend the semantics of field_names to allow for a dictionary of
> > attributes mapping to their default values, though you'd need a
> > marker to be able to specify a required field:
> > Record = namedtuple('Record', dict(url=Required,
> > destination=Required, checksum=''))
> > I suppose I'd prefer the former, although that might cut off the
> > ability to add other controlling arguments to the namedtuple()
> > API.
> I've implemented default parameters to namedtuples (and namedlists a
> mutable version) in https://pypi.python.org/pypi/namedlist
> The syntax is not great, but none of the options are awesome.
> >>> Point = namedlist.namedtuple('Point', [('x', 0), ('y', 100)])
> >>> p = Point() assert p.x == 0 assert p.y == 100
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.14 (GNU/Linux)
> -----END PGP SIGNATURE-----
> Python-ideas mailing list
> Python-ideas at python.org
> Code of Conduct: http://python.org/psf/codeofconduct/
--Guido van Rossum (python.org/~guido)
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Python-ideas