Issue 34475: functools.partial objects have no qualname attribute (original) (raw)

Created on 2018-08-23 14:25 by chris.jerdonek, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Messages (11)
msg323947 - (view) Author: Chris Jerdonek (chris.jerdonek) * (Python committer) Date: 2018-08-23 14:25
functools.partial objects have no __qualname__ attribute. This means, for example, that code expecting a callable that logs the __qualname__ attribute can break when passed a functools.partial object. Example: >>> import functools >>> int.__qualname__ 'int' >>> p = functools.partial(int) >>> p.__qualname__ Traceback (most recent call last): File "", line 1, in AttributeError: 'functools.partial' object has no attribute '__qualname__'
msg324912 - (view) Author: hongweipeng (hongweipeng) * Date: 2018-09-10 04:06
the functools.partial returns an instance not fun or cls.using `p.func.__qualname__` may be you want.
msg324913 - (view) Author: Chris Jerdonek (chris.jerdonek) * (Python committer) Date: 2018-09-10 04:48
Using p.func would name the function passed to functools.partial() rather than the partial object itself.
msg324914 - (view) Author: Karthikeyan Singaravelan (xtreak) * (Python committer) Date: 2018-09-10 06:17
It seems __repr__ call to partial object has qualname but I think it always returns "partial". Ref : https://github.com/python/cpython/blob/0afada163c7ef25c3a9d46ed445481fb69f2ecaf/Lib/functools.py#L276 >>> import functools >>> int.__qualname__ 'int' >>> p = functools.partial(int) >>> p.__qualname__ Traceback (most recent call last): File "", line 1, in AttributeError: 'functools.partial' object has no attribute '__qualname__' >>> p functools.partial(<class 'int'>) Thanks
msg327858 - (view) Author: hongweipeng (hongweipeng) * Date: 2018-10-17 04:45
partial() return an instance not class or function. Why it need __qualname__ attribute? Ref: https://www.python.org/dev/peps/pep-3155/
msg327862 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2018-10-17 05:40
I don't see a problem. Not all callables have the __qualname__ attribute. It is not the part of the protocol. The code that expects the __qualname__ attribute should be fixed.
msg327868 - (view) Author: Chris Jerdonek (chris.jerdonek) * (Python committer) Date: 2018-10-17 07:24
Okay, I thought a partial object was supposed to "look" like a function. I'm okay with closing this.
msg327957 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2018-10-18 10:10
partial objects lack many other function attributes: __name__, __module__ (and __qualname__ doesn't make sense without __module__), __annotations__, __get__(), etc. It would be nice to make these types more similar, but attributes shouldn't lie. And I am not sure what partial.__qualname__ can be. It shouldn't be the __qualname__ of the wrapped function, since the partial object differs from it, and is not accessible by same name.
msg328002 - (view) Author: Chris Jerdonek (chris.jerdonek) * (Python committer) Date: 2018-10-18 20:04
> It shouldn't be the __qualname__ of the wrapped function Yes, I agree with you. I was thinking it should be similar to what it would be for a function defined at the same location.
msg328006 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2018-10-18 21:21
functools.partial objects have no __qualname__ attribute, but they don't have a __name__ attribute neither. $ python3 Python 3.6.6 (default, Jul 19 2018, 14:25:17) >>> import functools >>> func=int >>> p=functools.partial(func) >>> p.__name__ AttributeError: 'functools.partial' object has no attribute '__name__' >>> p.__qualname__ AttributeError: 'functools.partial' object has no attribute '__qualname__' >>> repr(p) "functools.partial(<class 'int'>)" If you want to "inherit" the name of the "wrapped function", you may use: functools.update_wrapper(). I'm not sure that it's correct to inherit the name by default. functools.partial() creates a new function, so if it has a name, for me, it should be different. I agree to close the issue, it's not a bug.
msg328008 - (view) Author: Chris Jerdonek (chris.jerdonek) * (Python committer) Date: 2018-10-18 21:29
Sorry, I'm out of practice. I thought I closed this when I marked it rejected.
History
Date User Action Args
2022-04-11 14:59:05 admin set github: 78656
2018-10-18 21:29:12 chris.jerdonek set messages: +
2018-10-18 21:24:00 serhiy.storchaka set status: open -> closedstage: resolved
2018-10-18 21:21:51 vstinner set nosy: + vstinnermessages: +
2018-10-18 20:04:02 chris.jerdonek set messages: +
2018-10-18 10:10:27 serhiy.storchaka set messages: +
2018-10-17 07:24:07 chris.jerdonek set resolution: rejectedmessages: +
2018-10-17 05:40:01 serhiy.storchaka set nosy: + serhiy.storchakamessages: +
2018-10-17 04:45:47 hongweipeng set messages: +
2018-09-10 06:17:01 xtreak set messages: +
2018-09-10 06:09:56 xtreak set nosy: + xtreak
2018-09-10 04:48:47 chris.jerdonek set messages: +
2018-09-10 04:06:37 hongweipeng set nosy: + hongweipengmessages: +
2018-08-23 14:25:59 chris.jerdonek create