On 3/14/2012 4:22 PM, Michael Foord wrote: > > On 14 Mar 2012, at 13:08, Terry Reedy wrote: > >> On 3/14/2012 3:25 PM, michael.foord wrote: >>> +# mock.py +# Test tools for mocking and patching. >> Should there be a note here about restrictions on editing this >> file? I notice that there are things like >> >>> +class OldStyleClass: + pass +ClassType = type(OldStyleClass) >> >> which are only present for running under Py2 and which would >> normally be removed for Py3. > > > Yeah, I removed as much of the Python 2 compatibility code and > thought I'd got it all. Thanks for pointing it out. 2000 lines is a lot to check through. > > I'm maintaining a "clean" (no Python 2 compatibility code) version in > the standard library. Great. Here is something else, which is why I thought otherwise ;-). +def _instance_callable(obj): + """Given an object, return True if the object is callable. + For classes, return True if instances would be callable.""" + if not isinstance(obj, type): + # already an instance + return getattr(obj, '__call__', None) is not None + + klass = obj + # uses __bases__ instead of __mro__ so that we work with >>> old style classes + if klass.__dict__.get('__call__') is not None: + return True + + for base in klass.__bases__: + if _instance_callable(base): + return True + return False If you want to leave the code as is, remove or revise the comment. > I'll be maintaining mock, so I'd like to be > assigned any issues on it and at least talked to before changes are > made. I am maintaining a backport still, but the Python standard > library version is the canonical version. Add unittest.mock to devguide/experts.rst and yourself with * appended. --- Searching for 'old', I also found +def _must_skip(spec, entry, is_type): + if not isinstance(spec, type): + if entry in getattr(spec, '__dict__', {}): + # instance attribute - shouldn't skip + return False >>>+ # can't use type because of old style classes + spec = spec.__class__ + if not hasattr(spec, '__mro__'): >>>+ # old style class: can't have descriptors anyway + return is_type In testcallable.py + def test_patch_spec_callable_class(self): + class CallableX(X): + def __call__(self): + pass + + class Sub(CallableX): + pass + + class Multi(SomeClass, Sub): + pass + >>>+ class OldStyle: + def __call__(self): + pass + >>>+ class OldStyleSub(OldStyle): + pass + + for arg in 'spec', 'spec_set': >>>+ for Klass in CallableX, Sub, Multi, OldStyle, OldStyleSub: This is the last. -- Terry Jan Reedy
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4