[Python-ideas] namedtuple fields with default values
Barry Warsaw
barry at python.org
Fri Jul 17 16:44:15 CEST 2015
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.
Cheers,
-Barry
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20150717/0cb379f6/attachment.sig>
More information about the Python-ideas
mailing list