[Python-3000] PEP 3101 Updated
Ron Adam
rrr at ronadam.com
Thu Aug 23 03:08:35 CEST 2007
Eric Smith wrote:
> Ron Adam wrote:
>>> I've been re-reading the PEP, in an effort to make sure everything is
>>> working. I realized that these tests should not pass. The PEP says
>>> that "Format specifiers can themselves contain replacement fields".
>>> The tests above have replacement fields in the field name, which is
>>> not allowed. I'm going to remove this functionality.
>>>
>>> I believe the intent is to support a replacement for:
>>> "%.*s" % (4, 'how now brown cow')
>>>
>>> Which would be:
>>> "{0:.{1}}".format('how now brown cow', 4)
>>>
>>> For this, there's no need for replacement on field name. I've taken
>>> it out of the code, and made these tests in to errors.
>>
>> I think it should work myself, but it could be added back in later if
>> there is a need to.
>>
>>
>> I'm still concerned about the choice of {{ and }} as escaped brackets.
>>
>> What does the following do?
>>
>>
>> "{0:{{^{1}}".format('Python', '12')
>
> >>> "{0:{{^{1}}".format('Python', '12')
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> ValueError: unterminated replacement field
When are the "{{" and "}}" escape characters replaced with '{' and '}'?
> But:
> >>> "{0:^{1}}".format('Python', '12')
> ' Python '
>
>> "{{{0:{{^{1}}}}".format('Python', '12')
> >>> "{{{0:{{^{1}}}}".format('Python', '12')
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> ValueError: Unknown conversion type }
>
> But,
> >>> "{{{0:^{1}}".format('Python', '12')
> '{ Python '
So escaping '{' with '{{' and '}' with '}}' doesn't work inside of format
expressions?
That would mean there is no way to pass a brace to a __format__ method.
>> class ShowSpec(str):
>>
>> return spec
>>
>> ShowSpec("{0:{{{1}}}}").format('abc', 'xyz')
>>
>
> >>> ShowSpec("{0:{{{1}}}}").format('abc', 'xyz')
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> ValueError: Invalid conversion specification
> I think you mean:
> ShowSpec("{0:{1}}").format('abc', 'xyz')
No, because you may need to be able to pass the '{' and '}' character to
the format specifier in some way. The standard specifiers don't use them,
but custom specifiers may need them.
> But I have some error with that. I'm looking into it.
>
>> "{0}".format('{value:{{^{width}}', width='10', value='Python')
>
> >>> "{0}".format('{value:{{^{width}}', width='10', value='Python')
> '{value:{{^{width}}'
Depending on weather or not the evaluation is recursive this may or may not
be correct.
I think it's actually easier to do it recursively and not put limits on
where format specifiers can be used or not.
_RON
More information about the Python-3000
mailing list