> The signature is wrong. 
Thanks for remark. Of course proper signature would be:

def jin(a: Iterable[Optional[str]], sep=“ “):
    # …

> Why do you (ab)use compress for that?
Well, it seems that it is subjective. To me “[None, x, y, z]” -> “[x, y, z]” 
looks like “compression”. But if community agrees with your side, then, well, 
it’s OK.

As another argument to use “compress” was similar case I found on stackoverflow 
for numpy:
https://stackoverflow.com/questions/5927180/how-do-i-remove-all-zero-elements-from-a-numpy-array

So extending “compress” would be useful for math cases as well.

Alternatively indeed we can use:
2. Use "filter(None, a)”
3. (x for x in a if x)

Why not to use #3?

Only having #2 or #3, I would vote for “filter”. It is a builtin, and used to 
be implemented as intrinsic. In cpython it has a separate “if”  branch for case 
when first argument is “None” (see “filter_next” function in “bltinmodule.c”)

There is also a good chance to work with optimized “compress” one day.

#3 semantically is more complicated and it seems that there are no 
optimizations at least in cpython (but perhaps I’m wrong?). So, it looks like 
#3 is slower while parsing and while executing.

#3 is bad choice for code maintenance. It is always better to pass variable 
once. “(x for x in a if x)” contains micro code dups. Here, you put “x” three 
times, and then if you decide to use something else you have to edit it in 
three places. So #3 defeats if you want to reuse or just maintain such code.

Paul confirmed my worries about “jin”, so it seems that it is not an option 
either.

And yet, I still have a little hope about original proposal. I proposed to add 
default value for second argument of “compress”.

So thanks for you attention anyways, and let me know if it is still has a 
chance to be accepted.

Thanks!
Stepan Dyatkovskiy.

> On Sep 14, 2021, at 2:18 PM, Steven D'Aprano <st...@pearwood.info> wrote:
> 
> On Tue, Sep 14, 2021 at 11:31:43AM +0400, m...@dyatkovskiy.com wrote:
> 
>> Thus I have collection of options and some of them are empty or None. 
>> In order to get rendered command line options string I use “compress” 
>> in conjunction with “join":
>> 
>>>>> opts = " ".join(compress(flags, flags))
> 
> Why do you (ab)use compress for that?
> 
> I understand that `compress(flags, flags)` has the effect of filtering 
> for non-empty flags. But that's an obfuscated way to write it. Either of 
> these would be more understandable:
> 
> * `filter(None, flags)`  # could also use bool instead of None
> 
> * `(flag for flag in flags if flag)`
> 
> especially the last, although heavy users of functional languages may 
> prefer filter. But using compress with the same argument twice is just 
> weird.
> 
> And also fragile. You can't use an iterator for the flags.
> 
>>>> jin(iter(['a', 'b', '', 'c', 'd', 'e', 'f', '', 'g']))
>    'a  d'
> 
> 
>> I usually introduce alias for this:
>> 
>>>>> def jin(a: str, sep=“ “):
>>>>>    return sep.join(compress(a, a))
>> 
>> And I found that I use it quite frequently.
> 
> The signature is wrong. `flags` is a list of string options. If you pass 
> an actual string, you expand it with spaces:
> 
> 
>>>> jin('abc def')
>    'a b c   d e f'
> 
> 
> -- 
> Steve
> _______________________________________________
> 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/RPY7HJ4VIUL5PXRBBTCFT6AALXBLUUGF/
> Code of Conduct: http://python.org/psf/codeofconduct/

_______________________________________________
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/7JGPPNR35NQ7PWAEWHUTPBXU422HJZYC/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to