Syntactic sugar for assignment statements: one value to multiple targets?
gc
gc1223 at gmail.com
Tue Aug 16 15:50:52 EDT 2011
Thanks for all the discussion on this. Very illuminating. Sorry for
the long delay in responding--deadlines intervened.
I will use the list comprehension syntax for the foreseeable future.
Tim, I agree with you about the slurping in final position--it's
actually quite surprising. As I'm sure you realized, that behavior
makes your 'tidier' version:
a,b,c,d,e, *more_dict_generator = (dict() for _ in itertools.count())
break with a MemoryError, which I don't think is the result that most
people would expect.
Stephen wrote:
> While slightly ugly, it doesn't seem ugly enough to justify the
> extra complexity of special syntax for such a special case.
You're probably right (although for my coding this multiple assignment
scenario is a pretty ordinary case.) Anyway, I'll shop the a,b,c =
*dict() syntax over to python-ideas just to see what they say.
Thanks again, everyone! Happy Python.
On Aug 3, 7:25 am, Tim Chase <python.l... at tim.thechases.com> wrote:
> On 08/03/2011 03:36 AM, Katriel Cohn-Gordon wrote:
>
> > On Wed, Aug 3, 2011 at 9:25 AM, Steven D'Aprano wrote:
> >> a, b, c, d, e = [dict() for i in range(5)]
>
> > I think this is good code -- if you want five different dicts,
> > then you should call dict five times. Otherwise Python will
> > magically call your expression more than once, which isn't
> > very nice. And what if your datatype constructor has
> > side-effects?
>
> If the side-effects are correct behavior (perhaps opening files,
> network connections, or even updating a class variable) then
> constructor side-effects are just doing what they're supposed to.
> E.g. something I use somewhat regularly in my code[*]:
>
> a,b,c,d = (file('file%i.txt', 'w') for i in range(4))
>
> If the side-effects aren't performing the correct behavior, fix
> the constructor. :)
>
> -tkc
>
> [*] okay, it's more like
>
> (features,
> adjustments,
> internet,
> ) = (file(fname) for fname in (
> 'features.txt',
> 'adjustments.txt',
> 'internet.txt'
> )
>
> or even
>
> (features,
> adjustments,
> internet,
> ) = (
> set(
> line.strip().upper()
> for line
> in file(fname)
> if line.strip()
> )
> for fname in (
> 'features.txt',
> 'adjustments.txt',
> 'internet.txt'
> )
>
> to load various set() data from text-files.
More information about the Python-list
mailing list