On Sun, Oct 13, 2019 at 06:41:40PM -0400, David Mertz wrote:

> My real world is looking at some function in an existing codebase that
> handles a nested data structure.

That rules out sets, since sets aren't hashable and cannot be 
inserted into a set.


>  At some leaf I can tell I'm handling a
> bunch of scalars by looking at the code (i.e. a loop or a reduction).
> 
> Somewhere far upstream that data was added to the structure. And somewhere
> downstream we might do something sensitive to the data type. But right
> here, it's just "a bunch of stuff."

Let me see if I understand your workflow:

1. upstream: you build up a nested data structure, adding elements as 
needed

2. midstream: you treat the nested data structure as "a bunch of stuff"

3. downstream: you pull the nested data structure apart

In the midstream, what are you doing to this bunch of stuff? That's the 
critical point. It seems to me that there's not very much you can do 
(apart from printing it) without knowing something about the structure.

The upstream and the downstream will care about the structure, and will 
care about the distinction between sets and lists. Upstream needs to 
know that adding a set will fail, but appending a set will be fine:

    list.append(myset)  # fine, sets can go into lists
    set.add(myset)  # fails, because sets aren't hashable

Giving list-or-set a common "push/add/append" method won't help you 
here, you still need to distinguish between pushing to the end of a list 
and pushing into an unordered set.

If midstream is adding stuff, then it's not really midstream, its part 
of upstream. If midstream *isn't* adding stuff, then this proposed 
push/add/append common method is irrelevant to midstream.


> I rarely see the "bunch" being
> genuinely polymorphic, but I also just don't want or need to think about
> which collection it is to edit this code.... Except I do if I want to "just
> add item".

Can you add a set? If you append an element, will you introduce a 
duplicate? You surely care about this, which means you're not really 
indifferent to whether "bunch-of-stuff" is a list or a set.

I might have misunderstood your use-case, but so far I don't see that 
this is a convincing case for a common method.

I will admit that there's a tiny bit of convenience: you can write 
"bunch.push()" without thinking about what you are pushing into (is it a 
set? a list? nested or flat? a custom class?), and whether it will 
succeed and whether it will mess up your data structure. So 
"convenience" is a benefit of this common method.

But I think that argument from convenience is a weak argument. And a 
convenience function in your own module is probably sufficient, rather 
than burdening every Python user with having to learn another 
(redundant) method.

> Moreover, it's not uncommon to want to optimize the upstream choice of
> container and need as little refactoring downstream as possible.

There is that, but you have to balance the convenience of not having to 
mechanically change method names (don't you have an IDE with a refactor 
command for that?^1 ) versus the benefit of having two different 
operations (add to a set versus append to a list) having different, 
self-explanatory names.



^1 I don't, so I'm not entirely unsympathetic to this argument.



-- 
Steven
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/H6VDVYPLGO5R5WPJHI6KM6VDPHJIPTUM/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to