Issue 13672: Add co_qualname attribute in code objects (original) (raw)

Created on 2011-12-28 19:19 by Arfrever, last changed 2022-04-11 14:57 by admin. This issue is now closed.

Messages (10)

msg150312 - (view)

Author: Arfrever Frehtes Taifersar Arahesis (Arfrever) * (Python triager)

Date: 2011-12-28 19:19

PEP 3155 added qualified name as qualname attribute in classes and functions. It would be useful if qualified name was also available as co_qualname attribute of code objects.

import sys class A: ... def f1(): ... return B.f2() ... class B: ... def f2(): ... return sys._getframe(1) ... A.f1.name 'f1' A.f1.qualname 'A.f1' B.f2.name 'f2' B.f2.qualname 'B.f2' frame = A.f1() frame

>>> frame.f_code ", line 2> >>> frame.f_code.co_name 'f1' >>> frame.f_code.co_qualname Traceback (most recent call last): File "", line 1, in AttributeError: 'code' object has no attribute 'co_qualname'

Suggested behavior:

frame.f_code.co_qualname 'A.f1'

msg150313 - (view)

Author: Eric Snow (eric.snow) * (Python committer)

Date: 2011-12-28 20:08

with f_func (see #12857) you would get that for free:

frame.f_func.qualname 'A.f1'

msg150316 - (view)

Author: Arfrever Frehtes Taifersar Arahesis (Arfrever) * (Python triager)

Date: 2011-12-28 20:36

co_qualname could still be useful if somebody has code object without frame object.

msg150317 - (view)

Author: Eric Snow (eric.snow) * (Python committer)

Date: 2011-12-28 21:11

True. I wonder, though if perhaps a co_func (as a weak ref) or co_orig_func would be better, since co_qualname would be built from the original function anyway. Then you could call "code.co_func.func_qualname".

One sticky point is that there isn't a guarantee of one-to-one between function object and code object. A code object could be bound to several different functions as happens with function definitions (particularly lambdas) inside comprehensions.

Also, if a code object is not associated with a function, i.e. one generated by exec, what should the qualname for the code object be? How about, in CPython, the code objects created for classes and modules?

msg151922 - (view)

Author: Meador Inge (meador.inge) * (Python committer)

Date: 2012-01-24 19:41

On Wed, Dec 28, 2011 at 3:11 PM, Eric Snow <report@bugs.python.org> wrote:

One sticky point is that there isn't a guarantee of one-to-one between function object and code object.  A code object could be bound to several different functions as happens with function definitions (particularly lambdas) inside comprehensions.

Also, if a code object is not associated with a function, i.e. one generated by exec, what should the qualname for the code object be?  How about, in CPython, the code objects created for classes and modules?

We already these issues with 'co_name', though. These cases can be treated the same as they are for 'co_name':

''

compile('[i for i in [1, 2]]', '', 'exec').co_consts[0].co_qualname '' compile('class T: pass', '', 'exec').co_consts[0].co_qualname 'T' compile('class T: pass', '', 'exec').co_consts[0].co_name 'T' compile('a = 12', '', 'exec').co_name '' compile('a = 12', '', 'exec').co_qualname '' compile('lambda x: x', '', 'exec').co_consts[0].co_qualname '' compile('lambda x: x', '', 'exec').co_consts[0].co_name ''

msg151924 - (view)

Author: Meador Inge (meador.inge) * (Python committer)

Date: 2012-01-24 20:09

This seems to be a useful feature to me. Another area where it can help is with fixing function types. Currently the qualname can be lost:

def f(): ... def g(): ... pass ... return g ... g = f() g <function f..g at 0x7f1dac4d8ba0> types.FunctionType(f.code, {}) <function f at 0x7f1dac4dfae0> types.FunctionType(g.code, {})

There is no way to specify a qualname when constructing a 'FunctionType'. The name is derived from the code object. The qualname could be too if we fix this issue. I will open another issue for the 'FunctionType' problem.

I have attached a WIP patch. It passes the full test suite. I am somewhat unsure about the CAPI changes, though. They are a breaking API change. Do we need a *_QualName version instead like we did for 'PyFunction_NewWithQualName'? I think probably so. I will add doc updates to the patch once the API stuff gets worked out.

msg164011 - (view)

Author: Arfrever Frehtes Taifersar Arahesis (Arfrever) * (Python triager)

Date: 2012-06-25 20:17

Could this patch be included in Python 3.3?

msg164012 - (view)

Author: Antoine Pitrou (pitrou) * (Python committer)

Date: 2012-06-25 20:20

PyCode_New and PyCode_NewEmpty are documented public APIs, so you can't change their signatures like that.

msg186802 - (view)

Author: James Pye (James.Pye)

Date: 2013-04-13 19:26

Considering the API changes necessary for adding qualname, perhaps a better solution would be to just start using the qualname instead of the function's "basename"--co_name is the qualname. This would offer an automatic improvement to the readability of coverage/profiling tool reports. Admittedly, not sure what kind of breakage might ensue... =\

msg362261 - (view)

Author: Alex Hall (alexmojaki)

Date: 2020-02-19 10:15

I think this would be very useful in tracebacks. If a traceback line had a more useful name like MyClass.__init__ instead of just __init__ or my_decorator.<locals>.wrapper instead of just wrapper it would provide useful context to the frame.

History

Date

User

Action

Args

2022-04-11 14:57:25

admin

set

github: 57881

2021-12-30 00:20:44

iritkatriel

set

status: open -> closed
superseder: Propagate qualname from the compiler unit to code objects for finer grained profiling data
resolution: duplicate
stage: patch review -> resolved

2020-02-19 10:15:17

alexmojaki

set

nosy: + alexmojaki
messages: +

2014-07-03 08:36:34

berker.peksag

set

versions: + Python 3.5, - Python 3.3

2013-04-13 19:26:10

James.Pye

set

nosy: + James.Pye
messages: +

2012-06-25 20:20:07

pitrou

set

nosy: + georg.brandl

messages: +
stage: needs patch -> patch review

2012-06-25 20:17:38

Arfrever

set

messages: +

2012-01-24 20:09:55

meador.inge

set

files: + issue13672-v0.patch
keywords: + patch
messages: +

2012-01-24 19:41:25

meador.inge

set

messages: +

2011-12-28 23:11:17

meador.inge

set

nosy: + meador.inge

type: enhancement
stage: needs patch

2011-12-28 22:36:29

jcea

set

nosy: + jcea

2011-12-28 21:11:24

eric.snow

set

messages: +

2011-12-28 20:36:35

Arfrever

set

messages: +

2011-12-28 20:08:10

eric.snow

set

nosy: + eric.snow
messages: +

2011-12-28 19:19:59

Arfrever

create