DO-NOT-MERGE: bpo-34595: Add %t format to PyUnicode_FromFormatV()#9122
DO-NOT-MERGE: bpo-34595: Add %t format to PyUnicode_FromFormatV()#9122vstinner wants to merge 1 commit intopython:masterfrom vstinner:unicode_format_t
Conversation
Objects/typeobject.c
Outdated
There was a problem hiding this comment.
In case of non-heap types you can just return PyUnicode_FromString(type->tp_name).
In case of heap types the code can be a tiny bit simpler if inline _PyType_Module() and _PyType_QualName() because you can get rid of increfs/decrefs and NULL checks.
There was a problem hiding this comment.
In case of non-heap types you can just return PyUnicode_FromString(type->tp_name).
Done. This change removes "builtins." when formatting builtins type. So %T of a string becomes "str" (instead of "builtins.str"). IMHO it's the expected behaviour.
In case of heap types the code can be a tiny bit simpler if inline _PyType_Module() and _PyType_QualName() because you can get rid of increfs/decrefs and NULL checks.
I don't think that performance matters here. I prefer to reuse the same code, to make sure that type.qualname, type.module and %T behave the same for heap types.
Objects/typeobject.c
Outdated
There was a problem hiding this comment.
Why type_qualname() and type_module() have been renamed to _PyType_QualName() and _PyType_Module()?
There was a problem hiding this comment.
Hum. I moved code in a weird way. I fixed that.
Doc/c-api/unicode.rst
Outdated
There was a problem hiding this comment.
Except that the module name is omitted for types in the builtins module (and for non-heap extension types that don't specify the module, but this can be considered as a bug).
Objects/unicodeobject.c
Outdated
There was a problem hiding this comment.
What was used instead of %t/%T before?
There was a problem hiding this comment.
Python 3.7 code:
PyErr_Format(PyExc_TypeError,
"must be str, not %.100s",
Py_TYPE(obj)->tp_name);
There was a problem hiding this comment.
Thus it was closer to %T. In error messages it is better to use fully qualified names.
* The %T format of PyUnicode_FromFormatV() now returns the fully qualified name of an object type (ex: "module.namespace.typename"). * Add %t format to PyUnicode_FromFormatV(), and so to PyUnicode_FromFormat() and PyErr_Format(), to format the "short name" of an object type: equivalent to "%s" with _PyType_Name(Py_TYPE(obj)). * Replace %T format with %t format in unicodeobject.c. * Update existing NEWS entry
|
I rebased my changed and made requested changes. |
|
I propose to replace Py_TYPE(obj)->tp_name with %t in C to mimick Python code which uses type(obj).name or obj.class.name. If we want to use %T in C code, I suggest to also update the related Python code, especially for "C accelerators" modules like _asyncio/_pickle. I suggest to only start to use %T on a case by base basis. |
|
#Linux-PR_20180911.05 failed: the CI is broken, it failed on apt-get install. |
|
I changed the status of this PR to "DO-NOT-MERGE", since Petr Viktorin asked me to open a discussion on python-dev: |
qualified name of an object type (ex: "module.namespace.typename").
PyUnicode_FromFormat() and PyErr_Format(), to format the "short
name" of an object type: equivalent to "%s" with
_PyType_Name(Py_TYPE(obj)).
https://bugs.python.org/issue34595