Re: [Python-ideas] Have a "j" format option for lists

2018-06-27 Thread Antoine Pitrou
On Wed, 9 May 2018 09:39:08 -0300
Facundo Batista
 wrote:
> This way, I could do:
> 
> >>> authors = ["John", "Mary", "Estela"]
> >>> "Authors: {:, j}".format(authors)  
> 'Authors: John, Mary, Estela'
> 
> In this case the join can be made in the format yes, but this proposal
> would be very useful when the info to format comes inside a structure
> together with other stuff, like...
> 
> >>> info = {  
> ...   'title': "A book",
> ...   'price': Decimal("2.34"),
> ...   'authors: ["John", "Mary", "Estela"],
> ... }
> ...
> >>> print("{title!r} (${price}) by {authors:, j}".format(**info))  
> "A book" ($2.34) by John, Mary, Estela
> 
> What do you think?

-1.  I hate that the format language is slowly becoming more and more
crufty, leading to unreadable code.

Yes, typing `", ".join(...)` is more work, but at least the end result
is readable.

Regards

Antoine.


___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-10 Thread David Mertz
-1 on idea. Far too many edge cases that can't be handled... Or absurd
complexity added to format mini-language if it tries to handle them (and
still fails).

On Thu, May 10, 2018, 3:57 PM Eric V. Smith  wrote:

> On 5/10/18 12:28 PM, Facundo Batista wrote:
> > 2018-05-10 10:34 GMT-03:00 Chris Angelico :
> >
> >>>
> >>> Ideally, it will handle *any* iterable.
> >>
> >> If it's to handle arbitrary iterables, it can't be the normal style of
> >> "take this string, pass it to the object's __format__ method, and let
> >> it interpret it". That's why I suggested a bang notation instead. We
> >> have some already:
> >
> > Yes, I think it fits better, as it's not just a formatting, it's more
> > an "operation"...
> >
> >>  A "!j" flag
> >> could take an iterable, format each element using the given format,
> >> and then join them. The letter "j" makes good sense then, as it
> >
> > Where would you indicate the separator if we use the bang notation?
>
> You would have to wedge it in before the colon. Something like:
>
> f'{lst!j, :20}'
>
> But then you couldn't have a colon in the separator. And this would be
> our first conversion character to be more than a single character.
>
> I'm opposed to this proposal. Just call str.join(), or write a helper
> function or class (depending on what you're trying to do). It's not
> worth complicating what's already a complicated topic.
>
> Eric
> ___
> Python-ideas mailing list
> Python-ideas@python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-10 Thread Eric V. Smith

On 5/10/18 12:28 PM, Facundo Batista wrote:

2018-05-10 10:34 GMT-03:00 Chris Angelico :



Ideally, it will handle *any* iterable.


If it's to handle arbitrary iterables, it can't be the normal style of
"take this string, pass it to the object's __format__ method, and let
it interpret it". That's why I suggested a bang notation instead. We
have some already:


Yes, I think it fits better, as it's not just a formatting, it's more
an "operation"...


 A "!j" flag
could take an iterable, format each element using the given format,
and then join them. The letter "j" makes good sense then, as it


Where would you indicate the separator if we use the bang notation?


You would have to wedge it in before the colon. Something like:

f'{lst!j, :20}'

But then you couldn't have a colon in the separator. And this would be 
our first conversion character to be more than a single character.


I'm opposed to this proposal. Just call str.join(), or write a helper 
function or class (depending on what you're trying to do). It's not 
worth complicating what's already a complicated topic.


Eric
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-10 Thread Serhiy Storchaka

09.05.18 15:39, Facundo Batista пише:

authors = ["John", "Mary", "Estela"]
"Authors: {:, j}".format(authors)

'Authors: John, Mary, Estela'


In the case of the list of book or article authors it would be better to 
get "John, Mary and Estela" or "John, Mary, and Estela". In other cases 
"John, Mary & Estela" can be more appropriate.


I mean that in real case you will need to use an external function that 
implements more complex algorithm for formatting a list.


___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-10 Thread Chris Angelico
On Fri, May 11, 2018 at 2:28 AM, Facundo Batista
 wrote:
> 2018-05-10 10:34 GMT-03:00 Chris Angelico :
>>  A "!j" flag
>> could take an iterable, format each element using the given format,
>> and then join them. The letter "j" makes good sense then, as it
>
> Where would you indicate the separator if we use the bang notation?

It's your proposal, you can decide what works best for you. :) I don't
think there's anything quite like this, so go ahead and pick whatever
you reckon makes the most sense.

ChrisA
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-10 Thread Facundo Batista
2018-05-10 10:34 GMT-03:00 Chris Angelico :

>>
>> Ideally, it will handle *any* iterable.
>
> If it's to handle arbitrary iterables, it can't be the normal style of
> "take this string, pass it to the object's __format__ method, and let
> it interpret it". That's why I suggested a bang notation instead. We
> have some already:

Yes, I think it fits better, as it's not just a formatting, it's more
an "operation"...

>  A "!j" flag
> could take an iterable, format each element using the given format,
> and then join them. The letter "j" makes good sense then, as it

Where would you indicate the separator if we use the bang notation?

Thanks!

-- 
.Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Twitter: @facundobatista
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-10 Thread Chris Angelico
On Thu, May 10, 2018 at 11:13 PM, Facundo Batista
 wrote:
>> I would like to see you flesh out the idea. In particular, I'd like to see 
>> you
>> address cases where:
>> 1. The underlying members in the collection are not strings. Besides the 
>> basic
>>types such as numbers, it would also be nice to be able to apply formats
>>recursively so that one can construct a string using the attributes of
>>members that are objects or items or other collections.
>
> I didn't think about this at the time. I have the feeling (not really
> well thought yet) that "recursive formatting" will complicate
> everything too much, that doing str() (as {} defaults to) on every
> object would fulfill most of the basic cases and keep this simple.
>
>
>> 2. The ability to handle collections other than simple lists or iterables, 
>> such
>>as dictionaries.
>
> Ideally, it will handle *any* iterable.

If it's to handle arbitrary iterables, it can't be the normal style of
"take this string, pass it to the object's __format__ method, and let
it interpret it". That's why I suggested a bang notation instead. We
have some already:

>>> x = "O'Really?"
>>> print(f"!s: {x!s}  !r: {x!r}")
!s: O'Really?  !r: "O'Really?"

Those markers apply to ANY object, and pass it through str() or repr()
respectively, before using any provided format string. A "!j" flag
could take an iterable, format each element using the given format,
and then join them. The letter "j" makes good sense then, as it
parallels str.join() - this would be broadly similar to
"...".join(format(...) for x in iter).

ChrisA
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-10 Thread Facundo Batista
2018-05-10 8:02 GMT-03:00 Rhodri James :
> On 09/05/18 20:56, Facundo Batista wrote:
>>
>> 2018-05-09 13:48 GMT-03:00 Rhodri James :
>>
>>> -1 until you give me an actual spec rather than a curious example.
>>>
>>> Sorry if that sounds a bit rude, but I spend most of my time trying to
>>> find
>>
>>
>> Be sorry, it was rude.
>
>
> On reflection, I'm not sorry at all.  It needed to be said, and attempting
> to deduce a spec from a single example has already caused people to go off
> in a variety of different directions.  If provoking you into being even a
> bit more specific gets our collective cat herd moving in something more like
> the same direction, it'll be worth it.

I apologize if *I* was rude or made feel you badly in any way.


> I too didn't equate "j" with "join".  I was somewhat expecting "l" for
> "list" given that "s" for "sequence" is taken.  Should I take it that
> everything from the colon to the "j" is an implicitly delimited string to
> use for joining?

Yes.


> If so, does anything in that string need escaping, like say braces or other
> "j"s?  I'm not sure if format specifiers currently allow arbitrary text (I
> don't think they do, but I'm not sure), which might make this a more serious
> undertaking than it first looks.  Alternatively, are certain characters
> forbidden in this implicit join string?

Don't know.

I think I need to read this for ideas:
https://mail.python.org/pipermail/python-ideas/2015-September/035789.html


> I presume also that no other formatting is possible with this specifier: no
> field widths, no justification, none of the other stuff applicable to
> strings.  I'm not talking about formatting the original strings (or
> whatever) in the list, that would clearly involve crazy amounts of
> sub-formatting and look like a complete mess in the code, but I can see a
> need for formatting the final joined string, and I can't see a way of doing
> that from what you've given us.

I concur, joining *and* do special formatting for the elements would
be a mess. That's way in other mail I said that probably cover the
basic case (doing just str()) is better; if you want something more
complex you always can do it as a separate step :/

-- 
.Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Twitter: @facundobatista
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-10 Thread Facundo Batista
> I would like to see you flesh out the idea. In particular, I'd like to see you
> address cases where:
> 1. The underlying members in the collection are not strings. Besides the basic
>types such as numbers, it would also be nice to be able to apply formats
>recursively so that one can construct a string using the attributes of
>members that are objects or items or other collections.

I didn't think about this at the time. I have the feeling (not really
well thought yet) that "recursive formatting" will complicate
everything too much, that doing str() (as {} defaults to) on every
object would fulfill most of the basic cases and keep this simple.


> 2. The ability to handle collections other than simple lists or iterables, 
> such
>as dictionaries.

Ideally, it will handle *any* iterable.

Thanks!

-- 
.Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Twitter: @facundobatista
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-10 Thread Facundo Batista
2018-05-09 21:45 GMT-03:00 Steven D'Aprano :
> On Wed, May 09, 2018 at 04:56:38PM -0300, Facundo Batista wrote:
>> 2018-05-09 13:48 GMT-03:00 Rhodri James :
>>
>> > -1 until you give me an actual spec rather than a curious example.
>> >
>> > Sorry if that sounds a bit rude, but I spend most of my time trying to find
>>
>> Be sorry, it was rude.
>
> I do not agree that Rhodri's comments were rude. They were frank and
> honest constructive criticism of the presentation of your idea.
>
> I have no patience with hair-trigger accusations of "rudeness" as a
> debating tactic to curtail criticism, and your response to Rhodri's mild
> and fair words looks exactly like that. Whether you intended it that way
> or not, that is what it looks like to me.

I totally apologize if I made you, Rhodri or anybody to feel bad about
this. It was not my intention to do that.

It felt rude to me and I reacted badly, and too fast. I should have
behaved differently, sorry again.

Regards,

-- 
.Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Twitter: @facundobatista
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-10 Thread Eric V. Smith

On 5/10/18 7:02 AM, Rhodri James wrote:

If so, does anything in that string need escaping, like say braces or
other "j"s?  I'm not sure if format specifiers currently allow arbitrary
text (I don't think they do, but I'm not sure), which might make this a
more serious undertaking than it first looks.  Alternatively, are
certain characters forbidden in this implicit join string?


A format spec can contain anything. Its interpretation is completely 
left to the type being formatted. For example, a datetime supports a 
strftime() string, which can be anything:


>>> '{:today is %Y-%m-%d}'.format(datetime.datetime.now())
'today is 2018-05-10'

In str.format(), there's a restriction that the format spec can't 
contain a closing brace }, but that's solely a restriction of the string 
scanning that's going on, and not a function of the __format__ protocol 
itself. For example:


>>> format(datetime.datetime.now(), 'today is %Y-%m-%d {tada!}')
'today is 2018-05-10 {tada!}'

I always suggest to people that they don't look at f-strings or 
str.format() when coming up with examples, but instead use format() or 
obj.__format__() to more clearly see what's happening. In Facundo's 
original example:


authors = ["John", "Mary", "Estela"]
"Authors: {:, j}".format(authors)

it's best to think of this as:

"Authors: " + format(authors, ', j')

or the equivalent (in this case):

"Authors: " + authors.__format__(', j')

authors is a list in this example, so list.__format__() would have to 
understand the format spec ', j'. Okay, that's probably doable (although 
I'm not advocating it!). But you really don't want this to work just for 
lists. What about:


def authors1():
   yield "John"
   yield "Mary"
   yield "Estela"
format(authors1(), ', j')

How would that work? Would generators grow a __format__()? It's not 
possible to add this functionality to every iterator past, present, and 
future.


This is why I think a wrapper that adds a __format__(), which itself 
calls str.join(), is the only way to handle this. This is what I showed 
in my earlier response as the Join class. And at that point, I don't 
think it's really worth the hassle over just calling str.join().


Eric
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-10 Thread Rhodri James

On 09/05/18 20:56, Facundo Batista wrote:

2018-05-09 13:48 GMT-03:00 Rhodri James :


-1 until you give me an actual spec rather than a curious example.

Sorry if that sounds a bit rude, but I spend most of my time trying to find


Be sorry, it was rude.


On reflection, I'm not sorry at all.  It needed to be said, and 
attempting to deduce a spec from a single example has already caused 
people to go off in a variety of different directions.  If provoking you 
into being even a bit more specific gets our collective cat herd moving 
in something more like the same direction, it'll be worth it.


In that spirit, and trying not to take this as a challenge to see how 
rude I can be without actually being rude: ;-)


I too didn't equate "j" with "join".  I was somewhat expecting "l" for 
"list" given that "s" for "sequence" is taken.  Should I take it that 
everything from the colon to the "j" is an implicitly delimited string 
to use for joining?


If so, does anything in that string need escaping, like say braces or 
other "j"s?  I'm not sure if format specifiers currently allow arbitrary 
text (I don't think they do, but I'm not sure), which might make this a 
more serious undertaking than it first looks.  Alternatively, are 
certain characters forbidden in this implicit join string?


I presume also that no other formatting is possible with this specifier: 
no field widths, no justification, none of the other stuff applicable to 
strings.  I'm not talking about formatting the original strings (or 
whatever) in the list, that would clearly involve crazy amounts of 
sub-formatting and look like a complete mess in the code, but I can see 
a need for formatting the final joined string, and I can't see a way of 
doing that from what you've given us.


I'm not convinced, I admit.  Your use case

>>> print("{title!r} (${price}) by {authors:, j}".format(**info))
"A book" ($2.34) by John, Mary, Estela

is moderately compelling, but is starting to look too magic for my 
tastes.  I think it's the implicitly delimited join string; it isn't 
obvious at first sight that the comma and space aren't independently 
meaningful in some obscure way, like everything else in that position in 
a format would be.




This list is for throwing ideas and see if they gain momentum... if
yes, it will be time for a PEP.

I know how to do a PEP, believe me.

But if we'll be asking for a Spec for every idea we think may be
valuable, we'll stall.


Raising the barrier a bit is no bad thing in my opinion; it shouldn't be 
easy to add things to Python, otherwise we'd have a much uglier 
language.  Regardless, there is a difference between a full-blown PEP 
and an outline spec.  Much as I would like to have every jot and tittle 
in place for a first draft, I know that's not realistic and I don't 
expect it.  On the other hand, bitter experience has taught me that when 
the first draft of a proposal is as nebulous as what you gave us, I 
should walk away from the incipient disaster right now.


--
Rhodri James *-* Kynesim Ltd
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Raymond Hettinger
On May 9, 2018, at 7:39 AM, Facundo Batista  wrote:
> 
> This way, I could do:
> 
 authors = ["John", "Mary", "Estela"]
 "Authors: {:, j}".format(authors)
> 'Authors: John, Mary, Estela'
> 
...
> 
> What do you think?

That is an inspired idea.  I like it :-)


Raymond
 

___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Terry Reedy

On 5/9/2018 9:02 PM, Steven D'Aprano wrote:

On Thu, May 10, 2018 at 10:50:13AM +1000, Chris Angelico wrote:

On Thu, May 10, 2018 at 10:45 AM, Steven D'Aprano  wrote:

I too spent some time scratching my head trying to guess what you expect
this "j" format code to do, including the fundamental question "why j
and not some other letter?".


Interestingly, that question didn't faze me in the slightest. But
maybe my instant and automatic "oh you mean join" coloured my
expectations elsewhere, and possibly not correctly.


Oh, I didn't think of that! I was thinking i, j, k as integers, and
thinking "i is used, and j is the next letter".


I took me several minutes to *guess* that j abbreviated join.  It would 
have been better if it were given in the proposal.


--
Terry Jan Reedy

___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Ken Kundert
Facundo,
I think this is the beginning of a great feature. And it fills a hole in 
the 
current string formatting. Specifically, we can carefully control the 
formatting 
of the base data types, but not collections.

I would like to see you flesh out the idea. In particular, I'd like to see you 
address cases where:
1. The underlying members in the collection are not strings. Besides the basic 
   types such as numbers, it would also be nice to be able to apply formats 
   recursively so that one can construct a string using the attributes of 
   members that are objects or items or other collections.
2. The ability to handle collections other than simple lists or iterables, such 
   as dictionaries.

-Ken


On Wed, May 09, 2018 at 09:39:08AM -0300, Facundo Batista wrote:
> This way, I could do:
> 
> >>> authors = ["John", "Mary", "Estela"]
> >>> "Authors: {:, j}".format(authors)
> 'Authors: John, Mary, Estela'
> 
> In this case the join can be made in the format yes, but this proposal
> would be very useful when the info to format comes inside a structure
> together with other stuff, like...
> 
> >>> info = {
> ...   'title': "A book",
> ...   'price': Decimal("2.34"),
> ...   'authors: ["John", "Mary", "Estela"],
> ... }
> ...
> >>> print("{title!r} (${price}) by {authors:, j}".format(**info))
> "A book" ($2.34) by John, Mary, Estela
> 
> What do you think?
> 
> -- .Facundo
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Steven D'Aprano
On Thu, May 10, 2018 at 10:50:13AM +1000, Chris Angelico wrote:
> On Thu, May 10, 2018 at 10:45 AM, Steven D'Aprano  wrote:
> > I too spent some time scratching my head trying to guess what you expect
> > this "j" format code to do, including the fundamental question "why j
> > and not some other letter?".
> 
> Interestingly, that question didn't faze me in the slightest. But
> maybe my instant and automatic "oh you mean join" coloured my
> expectations elsewhere, and possibly not correctly.

Oh, I didn't think of that! I was thinking i, j, k as integers, and 
thinking "i is used, and j is the next letter".


-- 
Steve
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Chris Angelico
On Thu, May 10, 2018 at 10:45 AM, Steven D'Aprano  wrote:
> I too spent some time scratching my head trying to guess what you expect
> this "j" format code to do, including the fundamental question "why j
> and not some other letter?".

Interestingly, that question didn't faze me in the slightest. But
maybe my instant and automatic "oh you mean join" coloured my
expectations elsewhere, and possibly not correctly.

ChrisA
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Steven D'Aprano
On Wed, May 09, 2018 at 04:56:38PM -0300, Facundo Batista wrote:
> 2018-05-09 13:48 GMT-03:00 Rhodri James :
> 
> > -1 until you give me an actual spec rather than a curious example.
> >
> > Sorry if that sounds a bit rude, but I spend most of my time trying to find
> 
> Be sorry, it was rude.

I do not agree that Rhodri's comments were rude. They were frank and 
honest constructive criticism of the presentation of your idea.

I have no patience with hair-trigger accusations of "rudeness" as a 
debating tactic to curtail criticism, and your response to Rhodri's mild 
and fair words looks exactly like that. Whether you intended it that way 
or not, that is what it looks like to me.

I too spent some time scratching my head trying to guess what you expect 
this "j" format code to do, including the fundamental question "why j 
and not some other letter?". Even after I worked out some of it, I was 
still left with questions. So I think that Rhodri's criticism is 
completely valid: your post was vague, with a lack of detail and not 
even an attempt to provide a partial specification.

That doesn't have to be a formal specification, but it should be at 
least an attempt to say "this is what the format code means", rather 
than expect people to guess from a single example.

(By the way, if you answered my earlier questions, I haven't seen the 
answer.)

Dealing with under-specified, vague instructions, and the invariable 
failure to guess correctly what was intended, is frustrating, annoying 
and painful. We should not be surprised that vague proposals can trigger 
an angry response, but Rhodri's post showed great restraint.

It isn't just the waste of time and effort when when we guess wrong, it 
is also the implied disrespect: "I am too important to bother explaining 
myself to minions like you. Work out what I mean."

If an idea is important enough to post here, we should be willing to 
spend some time presenting the idea in sufficient detail so that people 
don't have to guess what we mean. As the Zen says, "Explicit is better 
than implicit".

No, that doesn't mean that we have to write a PEP before posting. There 
is a middle-ground between giving a single example and expecting people 
to extrapolate from it, and writing a full PEP.



-- 
Steve
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Facundo Batista
2018-05-09 13:48 GMT-03:00 Rhodri James :

> -1 until you give me an actual spec rather than a curious example.
>
> Sorry if that sounds a bit rude, but I spend most of my time trying to find

Be sorry, it was rude.

This list is for throwing ideas and see if they gain momentum... if
yes, it will be time for a PEP.

I know how to do a PEP, believe me.

But if we'll be asking for a Spec for every idea we think may be
valuable, we'll stall.

Regards,

-- 
.Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Twitter: @facundobatista
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Rhodri James

On 09/05/18 13:39, Facundo Batista wrote:

This way, I could do:


authors = ["John", "Mary", "Estela"]
"Authors: {:, j}".format(authors)

'Authors: John, Mary, Estela'

In this case the join can be made in the format yes, but this proposal
would be very useful when the info to format comes inside a structure
together with other stuff, like...


info = {

...   'title': "A book",
...   'price': Decimal("2.34"),
...   'authors: ["John", "Mary", "Estela"],
... }
...

print("{title!r} (${price}) by {authors:, j}".format(**info))

"A book" ($2.34) by John, Mary, Estela

What do you think?


-1 until you give me an actual spec rather than a curious example.

Sorry if that sounds a bit rude, but I spend most of my time trying to 
find polite ways to inform people that I'm perfectly capable of 
implementing the fluffy collection of vague aspirations and inconsistent 
terminology they have given me, but the results won't be what they 
expect and probably won't be what they want either.  And that's just 
talking to my boss :-)  If you want something specific you'll have to 
specify it, otherwise you'll get something else.


--
Rhodri James *-* Kynesim Ltd
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Paul Moore
On 9 May 2018 at 15:29, Eric V. Smith  wrote:
> On 5/9/18 10:01 AM, Paul Moore wrote:
>>
>> On 9 May 2018 at 14:49, Eric V. Smith  wrote:
>>>
>>> I would object to changing the format machinery. Any format spec should
>>> be
>>> interpreted by some object's __format__ method.
>>
>>
>> Agreed. In theory this is a nice idea, but the way formatting is
>> implemented (and the fact that join is a method on strings taking an
>> arbitrary iterable as an argument) means that it's a bad fit for the
>> format mini-language.
>>
>> I don't think the improved convenience is sufficient to warrant the
>> change that would be required in practice. (But if someone found a way
>> to make it work *without* changes to the underlying format machinery,
>> that would be a different matter...)
>
>
> Well, since you asked, let's combine this with dataclasses, because we can!
>
> from dataclasses import dataclass
> from typing import List
>
> @dataclass
> class Join:
> o: List[str]  # or similar
> def __format__(self, spec):
> return spec.join(self.o)
>
> l = ['a', 'b']
>
> print('{:, }'.format(Join(l)))
> print(f'{Join(l):-}')
>
> Gives:
> a, b
> a-b

:-)

Sorry, I should have been clearer. Given that

print('{}'.format(', '.join(l)))

isn't that difficult, at least for me the attraction of the proposal
was the possibility of not having to wrap the argument (whether in a
function call, or in a custom class). But the

print(f'{Join(l):-}')

approach is certainly cleaner looking than print(f'{", ".join(l)}').

Paul
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Eric V. Smith

On 5/9/18 10:01 AM, Paul Moore wrote:

On 9 May 2018 at 14:49, Eric V. Smith  wrote:

I would object to changing the format machinery. Any format spec should be
interpreted by some object's __format__ method.


Agreed. In theory this is a nice idea, but the way formatting is
implemented (and the fact that join is a method on strings taking an
arbitrary iterable as an argument) means that it's a bad fit for the
format mini-language.

I don't think the improved convenience is sufficient to warrant the
change that would be required in practice. (But if someone found a way
to make it work *without* changes to the underlying format machinery,
that would be a different matter...)


Well, since you asked, let's combine this with dataclasses, because we can!

from dataclasses import dataclass
from typing import List

@dataclass
class Join:
o: List[str]  # or similar
def __format__(self, spec):
return spec.join(self.o)

l = ['a', 'b']

print('{:, }'.format(Join(l)))
print(f'{Join(l):-}')

Gives:
a, b
a-b

Eric
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Paul Moore
On 9 May 2018 at 14:49, Eric V. Smith  wrote:
> On 5/9/18 9:28 AM, Chris Angelico wrote:
>> On Wed, May 9, 2018 at 11:06 PM, Steven D'Aprano 
>> wrote:
>>
>>> - do you truly mean lists *only*, or is any iterable acceptible?
>>
>> With the letter being "j" and the semantics being lifted from
>> str.join(), I would guess the latter.
>
> Since '{:spec}'.format(obj) basically becomes obj.__format__('spec'), this
> would have to be implemented on a concrete type (in the above example,
> list).

[...]

> I would object to changing the format machinery. Any format spec should be
> interpreted by some object's __format__ method.

Agreed. In theory this is a nice idea, but the way formatting is
implemented (and the fact that join is a method on strings taking an
arbitrary iterable as an argument) means that it's a bad fit for the
format mini-language.

I don't think the improved convenience is sufficient to warrant the
change that would be required in practice. (But if someone found a way
to make it work *without* changes to the underlying format machinery,
that would be a different matter...)

Paul
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Eric V. Smith

On 5/9/18 9:28 AM, Chris Angelico wrote:

On Wed, May 9, 2018 at 11:06 PM, Steven D'Aprano  wrote:

On Wed, May 09, 2018 at 09:39:08AM -0300, Facundo Batista wrote:

This way, I could do:


authors = ["John", "Mary", "Estela"]
"Authors: {:, j}".format(authors)

'Authors: John, Mary, Estela'




Looks interesting, but I think we need to know the semantics in more
detail. For example:

- if the items of the list aren't already strings, how are they
  converted?


I'd expect that they'd be converted using format(), which by default
would just call str(). How you'd go about specifying a format string,
though, I'm not sure.


- do you truly mean lists *only*, or is any iterable acceptible?


With the letter being "j" and the semantics being lifted from
str.join(), I would guess the latter.


Since '{:spec}'.format(obj) basically becomes obj.__format__('spec'), 
this would have to be implemented on a concrete type (in the above 
example, list).



From the sound of it, this would be a change made to format(), or
rather the underlying C level function, PyObject_Format(). If done
there, it would also automatically apply to f-strings and anything
else that calls format(). Perhaps the right way is not a colon marker,
but an enhancement to the ! notation? We currently have !s and !r to
do str() and repr(), and this could be !j followed by a join string.
Combining this with a colon would allow the individual elements to be
formatted with the given string, and then joined. For instance:


I would object to changing the format machinery. Any format spec should 
be interpreted by some object's __format__ method.


Eric


x = [1,2,3]
msg = '#{x:3d!j, }#'.format(x=x)
# or equivalently
msg = f'#{x:3d!j, }#'
assert msg == '#  1,   2,   3#'

+0.5 on this. I don't currently yearn for it, but I'd probably use it
if it were available.

ChrisA
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Eric V. Smith

On 5/9/18 8:39 AM, Facundo Batista wrote:

This way, I could do:


authors = ["John", "Mary", "Estela"]
"Authors: {:, j}".format(authors)

'Authors: John, Mary, Estela'

In this case the join can be made in the format yes, but this proposal
would be very useful when the info to format comes inside a structure
together with other stuff, like...


info = {

...   'title': "A book",
...   'price': Decimal("2.34"),
...   'authors: ["John", "Mary", "Estela"],
... }
...

print("{title!r} (${price}) by {authors:, j}".format(**info))

"A book" ($2.34) by John, Mary, Estela

What do you think?


Among other things, I think you should use .format_map(info) instead of 
.format(**info)!


Eric

___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Chris Angelico
On Wed, May 9, 2018 at 11:06 PM, Steven D'Aprano  wrote:
> On Wed, May 09, 2018 at 09:39:08AM -0300, Facundo Batista wrote:
>> This way, I could do:
>>
>> >>> authors = ["John", "Mary", "Estela"]
>> >>> "Authors: {:, j}".format(authors)
>> 'Authors: John, Mary, Estela'
>
>
>
> Looks interesting, but I think we need to know the semantics in more
> detail. For example:
>
> - if the items of the list aren't already strings, how are they
>   converted?

I'd expect that they'd be converted using format(), which by default
would just call str(). How you'd go about specifying a format string,
though, I'm not sure.

> - do you truly mean lists *only*, or is any iterable acceptible?

With the letter being "j" and the semantics being lifted from
str.join(), I would guess the latter.


>From the sound of it, this would be a change made to format(), or
rather the underlying C level function, PyObject_Format(). If done
there, it would also automatically apply to f-strings and anything
else that calls format(). Perhaps the right way is not a colon marker,
but an enhancement to the ! notation? We currently have !s and !r to
do str() and repr(), and this could be !j followed by a join string.
Combining this with a colon would allow the individual elements to be
formatted with the given string, and then joined. For instance:

x = [1,2,3]
msg = '#{x:3d!j, }#'.format(x=x)
# or equivalently
msg = f'#{x:3d!j, }#'
assert msg == '#  1,   2,   3#'

+0.5 on this. I don't currently yearn for it, but I'd probably use it
if it were available.

ChrisA
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Wolfgang Maier

On 05/09/2018 02:39 PM, Facundo Batista wrote:

This way, I could do:


authors = ["John", "Mary", "Estela"]
"Authors: {:, j}".format(authors)

'Authors: John, Mary, Estela'

In this case the join can be made in the format yes, but this proposal
would be very useful when the info to format comes inside a structure
together with other stuff, like...


info = {

...   'title': "A book",
...   'price': Decimal("2.34"),
...   'authors: ["John", "Mary", "Estela"],
... }
...

print("{title!r} (${price}) by {authors:, j}".format(**info))

"A book" ($2.34) by John, Mary, Estela

What do you think?



For reference (first message of a rather long previous thread): 
https://mail.python.org/pipermail/python-ideas/2015-September/035787.html


___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Steven D'Aprano
On Wed, May 09, 2018 at 09:39:08AM -0300, Facundo Batista wrote:
> This way, I could do:
> 
> >>> authors = ["John", "Mary", "Estela"]
> >>> "Authors: {:, j}".format(authors)
> 'Authors: John, Mary, Estela'



Looks interesting, but I think we need to know the semantics in more 
detail. For example:

- if the items of the list aren't already strings, how are they
  converted?

- do you truly mean lists *only*, or is any iterable acceptible?

Here's a tiny proof-of-concept for the feature:

import string
class Template(string.Formatter):
def format_field(self, value, spec):
if spec.endswith('j'):
value = ', '.join(map(str, value))
spec = spec[:-1] + 's'
return super(Template, self).format_field(value, spec)

Template().format('{:j} => {:d}', ['alpha', 'beta', 42, 'delta'], 99)

# returns 'alpha, beta, 42, delta => 99'



-- 
Steve
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/


Re: [Python-ideas] Have a "j" format option for lists

2018-05-09 Thread Joao S. O. Bueno
On 9 May 2018 at 09:39, Facundo Batista  wrote:
> This way, I could do:
>
 authors = ["John", "Mary", "Estela"]
 "Authors: {:, j}".format(authors)
> 'Authors: John, Mary, Estela'

+1.
I bit concerned about the relevant whitespace in there,
but just a little bit - it is already inside a string-literal anyway.


>
> In this case the join can be made in the format yes, but this proposal
> would be very useful when the info to format comes inside a structure
> together with other stuff, like...
>
 info = {
> ...   'title': "A book",
> ...   'price': Decimal("2.34"),
> ...   'authors: ["John", "Mary", "Estela"],
> ... }
> ...
 print("{title!r} (${price}) by {authors:, j}".format(**info))
> "A book" ($2.34) by John, Mary, Estela
>
> What do you think?
>
> --
> .Facundo
>
___
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/