[Python-Dev] bpo-34595: How to format a type name?

Serhiy Storchaka storchaka at gmail.com
Wed Sep 12 01:53:24 EDT 2018


12.09.18 01:23, Victor Stinner пише:
> But then Petr Viktorin asked me to open a thread on python-dev to get
> a wider discussion. So here I am.

Thank you for opening this discussion Victor. I wanted to do it myself, 
but you have wrote much better description of the problem. See also 
related issues:

https://bugs.python.org/issue21861
https://bugs.python.org/issue22032 (solved)
https://bugs.python.org/issue22033 (solved)
https://bugs.python.org/issue27541 (solved)
https://bugs.python.org/issue28062

There were also attempts to change repr/str of types so that they return 
just a FQN. It would help to solve the issue from Python side. This idea 
was initially suggested by Guido, but later he changed his mind.

> The rationale for this change is to fix multiple issues:
> 
> * C extensions use Py_TYPE(obj)->tp_name which returns a fully
> qualified name for C types, but the name (without the module) for
> Python name. Python modules use type(obj).__name__ which always return
> the short name.

Sometimes Python modules use FQN, but this is not common, and the code 
is cumbersome. It is more common to use obj.__class__ instead of 
type(obj), the difference is intentionally ignored.

> * currently, many C extensions truncate the type name: use "%.80s"
> instead of "%s" to format a type name

AFAIK the rationale of this in PyUnicode_FromFormat() is that if you 
have corrupted type object, tp_name can point on arbitrary place in 
memory, and an attempt to interpret it as null terminated string can 
output a large amount of trash. It is better to get a truncated type 
name in error message (names of real types usually are below that limit) 
than get tons of trash or an error in attempt to format it.

> Maybe we can have "name: {0:t}, FQN: {0:T}".format(type(obj)). "t" for
> name and "T" for fully qualfied name. We would only have to modify
> type.__format__().

This will make the feature inconsistent in Python and C. In Python, the 
argument is a type, in C it is an instance of the type. We need a way to 
format a FQN in C for types themselves. It is less common case, but 
using _PyType_FullName() for it is very non-convenient as you have shown 
above.



More information about the Python-Dev mailing list