New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
functools.partial objects have no __qualname__ attribute #78656
Comments
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 "<stdin>", line 1, in <module>
AttributeError: 'functools.partial' object has no attribute '__qualname__' |
the functools.partial returns an instance not fun or cls.using |
Using p.func would name the function passed to functools.partial() rather than the partial object itself. |
It seems __repr__ call to partial object has qualname but I think it always returns "partial". Ref : Line 276 in 0afada1
>>> import functools
>>> int.__qualname__
'int'
>>> p = functools.partial(int)
>>> p.__qualname__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'functools.partial' object has no attribute '__qualname__'
>>> p
functools.partial(<class 'int'>) Thanks |
partial() return an instance not class or function. Why it need __qualname__ attribute? |
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. |
Okay, I thought a partial object was supposed to "look" like a function. I'm okay with closing this. |
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. |
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. |
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. |
Sorry, I'm out of practice. I thought I closed this when I marked it rejected. |
Is this still the right approach? |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: