diff options
Diffstat (limited to 'src/zope/interface/interface.py')
| -rw-r--r-- | src/zope/interface/interface.py | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/zope/interface/interface.py b/src/zope/interface/interface.py index 1681c75..b5d0e92 100644 --- a/src/zope/interface/interface.py +++ b/src/zope/interface/interface.py @@ -698,11 +698,18 @@ def fromFunction(func, interface=None, imlevel=0, name=None): defaults = getattr(func, '__defaults__', None) or () code = func.__code__ # Number of positional arguments - na = code.co_argcount-imlevel + na = code.co_argcount - imlevel names = code.co_varnames[imlevel:] opt = {} # Number of required arguments - nr = na-len(defaults) + defaults_count = len(defaults) + if not defaults_count: + # PyPy3 uses ``__defaults_count__`` for builtin methods + # like ``dict.pop``. Surprisingly, these don't have recorded + # ``__defaults__`` + defaults_count = getattr(func, '__defaults_count__', 0) + + nr = na - defaults_count if nr < 0: defaults = defaults[-nr:] nr = 0 |
