New submission from Erez Zinman <erezinman.program...@gmail.com>:

Consider the following code:

```
from abc import ABC, abstractmethod
from functools import wraps

class A(ABC):
    @abstractmethod
    def f(self):
        pass
    
    @wraps(f)
    def wrapper(self):
        print('f is called!')
        f()
        
class B(A):
    def f(self):
        print('f!')

B()
```

The last line of code results in the following error:
>>> TypeError: Can't instantiate abstract class B with abstract methods wrapper

That happens because `wraps` copies the `__dict__` of the original function. 
The problem is that at the point of declaration, the `__dict__` also contained 
`__isabstractmethod__=True` so it was copied as well, and it caused an error on 
the class' instantiation even though it contained no abstract methods. 
Moreover, this behavior is misleading because the the wrapper function is not 
abstract. 

Thanks.

----------
components: Extension Modules, Library (Lib)
messages: 385538
nosy: erezinman
priority: normal
severity: normal
status: open
title: @functools.wraps and abc.abstractmethod interoperability
type: behavior
versions: Python 3.6

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue43010>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to