[Python-porting] python 2/3 compatibility of function call

Brett Cannon brett at python.org
Tue Oct 10 12:40:59 EDT 2017


Did you try decorating the method with @staticmethod?

On Mon, 9 Oct 2017 at 08:47 Radostin Stoyanov <rstoyanov1 at gmail.com> wrote:

> Hello all,
>
> I am working on a patch series for virt-manager [1] which aims to resolve
> compatibility issues with Python 3. However I stuck with the following
> issue:
>
> 1. When I run the tests with Python 3 some of them fail with:
>
>     TypeError: set_memory_cb() takes 4 positional arguments but 5 were
> given
>
> These errors are coming from this function call
> <https://github.com/virt-manager/virt-manager/blob/master/virtinst/cli.py#L927>
> :
>
>     self.cb(parser, inst, self.val, self)
>
> Where `self.cb` is assigned to `ParserMemory.set_memory_cb`.
>
> I found that the concept of “unbound methods” has been removed in Python
> 3. [2]
> When referencing a method as a class attribute, you now get a plain
> function object.
>
> Example:
>
> - Python 2
>
>     >>> class X:
>     ...     def foo(self): return 1
>     ...
>     >>> bar = X.foo
>     >>> type(bar)
>     <type 'instancemethod'>
>     >>> X.foo(X())
>     1
>     >>> X.foo(0)
>     Traceback (most recent call last):
>       File "<stdin>", line 1, in <module>
>     TypeError: unbound method foo() must be c
>     alled with X instance as first argument (
>     got int instance instead)
>
> - Pyhton 3
>
>     >>> class X:
>     ...     def foo(self): return 1
>     ...
>     >>> bar = X.foo
>     >>> type(bar)
>     <class 'function'>
>     >>> X.foo(X())
>     1
>     >>> X.foo(0)
>     1
>
> However, I could not reproduce the issue causing TypeError as above. One
> hacky solution could be to change functions like `set_memory_cb` in the
> following way:
>
> from
>
>     def set_memory_cb(self, inst, val, virtarg):
>         setattr(inst, virtarg.cliname, int(val) * 1024)
>
> to
>
>     def set_memory_cb(self, inst, val, virtarg, ignore=None):
>         if ignore:
>             self, inst, val, virtarg = inst, val, virtarg, ignore
>          setattr(inst, virtarg.cliname, int(val) * 1024)
>
> However,  I would like to ask for suggestions on how this issue could be
> resolved properly?
>
> [1] https://github.com/virt-manager/virt-manager
> [2]
> https://docs.python.org/release/3.0.1/whatsnew/3.0.html#operators-and-special-methods
>
> Kind Regards,
> Radostin
> _______________________________________________
> Python-porting mailing list
> Python-porting at python.org
> https://mail.python.org/mailman/listinfo/python-porting
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-porting/attachments/20171010/d3e4048d/attachment.html>


More information about the Python-porting mailing list