summaryrefslogtreecommitdiff
path: root/src/zope/interface/interface.py
diff options
context:
space:
mode:
authorJason Madden <jamadden@gmail.com>2020-02-06 09:02:56 -0600
committerJason Madden <jamadden@gmail.com>2020-02-06 09:02:56 -0600
commit0b0e22727b52aa2e0f05884ce130524700163902 (patch)
tree45a3aac378da646272b02f04d660d4f868d40219 /src/zope/interface/interface.py
parent0048a56bac299db7c78a9c8e52c5928e4ec06f38 (diff)
downloadzope-interface-issue118.tar.gz
Fix verification for methods of builtin types with pseudo-default arguments on Pypyissue118
On PyPy2, they are ignored (like on CPython), but on PyPy3 they can actually be validated. Fixes #118
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