Describe the bug
Using @magic_factory on a class method will not properly pass self to its generated function guis, likely because it is using functools.partial instead of functools.partialmethod internally.
To Reproduce
from magicgui import magic_factory
class C:
def __init__(self, x: int):
self.x = x
self.func = self.func_fact()
@magic_factory()
def func_fact(self):
print(self.x)
# In in ideal world, this would also work:
# func = func_fact()
c = C(x=5)
c.func()
# c.func_fact()() # This also fails
Traceback
c:\Users\andrew\Code\project\code\sandbox\magic_factory_method.py:7: FutureWarning: functools.partial will be a method descriptor in future Python versions; wrap it in staticmethod() if you want to preserve the old behavior
self.func = self.func_fact()
Traceback (most recent call last):
File "c:\Users\andrew\Code\project\code\sandbox\magic_factory_method.py", line 16, in <module>
c.func()
~~~~~~^^
File "C:\Users\andrew\Code\project\code\.venv\Lib\site-packages\magicgui\widgets\_function_gui.py", line 338, in __call__
raise TypeError(msg) from None
TypeError: missing a required argument: 'self' in call to 'func_fact(self)'.
To avoid this error, you can bind a value or callback to the parameter:
func_fact.self.bind(value)
Or use the 'bind' option in the magicgui decorator:
@magicgui(self={'bind': value})
def func_fact(self): ...
Expected behavior
I would expect @magic_factory to work on a class method.
Environment (please complete the following information):
- OS: Windows, Python 3.13.9
- backend: PyQt6==6.9.1
- magicgui version: from main branch
Describe the bug
Using
@magic_factoryon a class method will not properly passselfto its generated function guis, likely because it is usingfunctools.partialinstead offunctools.partialmethodinternally.To Reproduce
Traceback
Expected behavior
I would expect
@magic_factoryto work on a class method.Environment (please complete the following information):