diff options
| author | Jason Madden <jamadden@gmail.com> | 2020-02-06 09:02:56 -0600 |
|---|---|---|
| committer | Jason Madden <jamadden@gmail.com> | 2020-02-06 09:02:56 -0600 |
| commit | 0b0e22727b52aa2e0f05884ce130524700163902 (patch) | |
| tree | 45a3aac378da646272b02f04d660d4f868d40219 /src/zope/interface/interface.py | |
| parent | 0048a56bac299db7c78a9c8e52c5928e4ec06f38 (diff) | |
| download | zope-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.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 |
