summaryrefslogtreecommitdiff
path: root/src/zope/interface/interface.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/zope/interface/interface.py')
-rw-r--r--src/zope/interface/interface.py11
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