| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  | from test_support import verbose, TestFailed, verify | 
					
						
							|  |  |  | import types | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class F: | 
					
						
							|  |  |  |     def a(self): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def b(): | 
					
						
							|  |  |  |     'my docstring' | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # setting attributes on functions | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     b.publish | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | except AttributeError: pass | 
					
						
							|  |  |  | else: raise TestFailed, 'expected AttributeError' | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | if b.__dict__ <> {}: | 
					
						
							|  |  |  |     raise TestFailed, 'expected unassigned func.__dict__ to be {}' | 
					
						
							| 
									
										
										
										
											2001-02-26 18:07:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  | b.publish = 1 | 
					
						
							|  |  |  | if b.publish <> 1: | 
					
						
							|  |  |  |     raise TestFailed, 'function attribute not set to expected value' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | docstring = 'its docstring' | 
					
						
							|  |  |  | b.__doc__ = docstring | 
					
						
							|  |  |  | if b.__doc__ <> docstring: | 
					
						
							|  |  |  |     raise TestFailed, 'problem with setting __doc__ attribute' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if 'publish' not in dir(b): | 
					
						
							|  |  |  |     raise TestFailed, 'attribute not in dir()' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | try: | 
					
						
							|  |  |  |     del b.__dict__ | 
					
						
							| 
									
										
										
										
											2001-09-18 03:55:22 +00:00
										 |  |  | except TypeError: pass | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | else: raise TestFailed, 'del func.__dict__ expected TypeError' | 
					
						
							| 
									
										
										
										
											2001-02-26 18:07:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | b.publish = 1 | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | try: | 
					
						
							|  |  |  |     b.__dict__ = None | 
					
						
							| 
									
										
										
										
											2001-09-18 03:55:22 +00:00
										 |  |  | except TypeError: pass | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | else: raise TestFailed, 'func.__dict__ = None expected TypeError' | 
					
						
							| 
									
										
										
										
											2001-02-26 18:07:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | d = {'hello': 'world'} | 
					
						
							|  |  |  | b.__dict__ = d | 
					
						
							|  |  |  | if b.func_dict is not d: | 
					
						
							|  |  |  |     raise TestFailed, 'func.__dict__ assignment to dictionary failed' | 
					
						
							|  |  |  | if b.hello <> 'world': | 
					
						
							|  |  |  |     raise TestFailed, 'attribute after func.__dict__ assignment failed' | 
					
						
							| 
									
										
										
										
											2001-02-26 18:07:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  | f1 = F() | 
					
						
							|  |  |  | f2 = F() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     F.a.publish | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | except AttributeError: pass | 
					
						
							|  |  |  | else: raise TestFailed, 'expected AttributeError' | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     f1.a.publish | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | except AttributeError: pass | 
					
						
							|  |  |  | else: raise TestFailed, 'expected AttributeError' | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-26 18:07:26 +00:00
										 |  |  | # In Python 2.1 beta 1, we disallowed setting attributes on unbound methods | 
					
						
							|  |  |  | # (it was already disallowed on bound methods).  See the PEP for details. | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     F.a.publish = 1 | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  | except (AttributeError, TypeError): pass | 
					
						
							|  |  |  | else: raise TestFailed, 'expected AttributeError or TypeError' | 
					
						
							| 
									
										
										
										
											2001-02-26 18:07:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # But setting it explicitly on the underlying function object is okay. | 
					
						
							|  |  |  | F.a.im_func.publish = 1 | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if F.a.publish <> 1: | 
					
						
							|  |  |  |     raise TestFailed, 'unbound method attribute not set to expected value' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if f1.a.publish <> 1: | 
					
						
							|  |  |  |     raise TestFailed, 'bound method attribute access did not work' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if f2.a.publish <> 1: | 
					
						
							|  |  |  |     raise TestFailed, 'bound method attribute access did not work' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if 'publish' not in dir(F.a): | 
					
						
							|  |  |  |     raise TestFailed, 'attribute not in dir()' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     f1.a.publish = 0 | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  | except (AttributeError, TypeError): pass | 
					
						
							|  |  |  | else: raise TestFailed, 'expected AttributeError or TypeError' | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-26 18:07:26 +00:00
										 |  |  | # See the comment above about the change in semantics for Python 2.1b1 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     F.a.myclass = F | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  | except (AttributeError, TypeError): pass | 
					
						
							|  |  |  | else: raise TestFailed, 'expected AttributeError or TypeError' | 
					
						
							| 
									
										
										
										
											2001-02-26 18:07:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | F.a.im_func.myclass = F | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  | f1.a.myclass | 
					
						
							|  |  |  | f2.a.myclass | 
					
						
							|  |  |  | f1.a.myclass | 
					
						
							|  |  |  | F.a.myclass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if f1.a.myclass is not f2.a.myclass or \ | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  |        f1.a.myclass is not F.a.myclass: | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  |     raise TestFailed, 'attributes were not the same' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # try setting __dict__ | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     F.a.__dict__ = (1, 2, 3) | 
					
						
							| 
									
										
										
										
											2001-10-22 02:00:09 +00:00
										 |  |  | except (AttributeError, TypeError): pass | 
					
						
							|  |  |  | else: raise TestFailed, 'expected TypeError or AttributeError' | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-26 18:07:26 +00:00
										 |  |  | F.a.im_func.__dict__ = {'one': 11, 'two': 22, 'three': 33} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  | if f1.a.two <> 22: | 
					
						
							|  |  |  |     raise TestFailed, 'setting __dict__' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from UserDict import UserDict | 
					
						
							|  |  |  | d = UserDict({'four': 44, 'five': 55}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     F.a.__dict__ = d | 
					
						
							| 
									
										
										
										
											2001-10-22 02:00:09 +00:00
										 |  |  | except (AttributeError, TypeError): pass | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | else: raise TestFailed | 
					
						
							| 
									
										
										
										
											2001-01-15 20:30:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if f2.a.one <> f1.a.one <> F.a.one <> 11: | 
					
						
							|  |  |  |     raise TestFailed | 
					
						
							| 
									
										
										
										
											2001-01-15 21:00:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # im_func may not be a Python method! | 
					
						
							|  |  |  | import new | 
					
						
							|  |  |  | F.id = new.instancemethod(id, None, F) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | eff = F() | 
					
						
							|  |  |  | if eff.id() <> id(eff): | 
					
						
							|  |  |  |     raise TestFailed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     F.id.foo | 
					
						
							|  |  |  | except AttributeError: pass | 
					
						
							|  |  |  | else: raise TestFailed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     F.id.foo = 12 | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  | except (AttributeError, TypeError): pass | 
					
						
							| 
									
										
										
										
											2001-01-15 21:00:02 +00:00
										 |  |  | else: raise TestFailed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     F.id.foo | 
					
						
							|  |  |  | except AttributeError: pass | 
					
						
							|  |  |  | else: raise TestFailed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     eff.id.foo | 
					
						
							|  |  |  | except AttributeError: pass | 
					
						
							|  |  |  | else: raise TestFailed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     eff.id.foo = 12 | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  | except (AttributeError, TypeError): pass | 
					
						
							| 
									
										
										
										
											2001-01-15 21:00:02 +00:00
										 |  |  | else: raise TestFailed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     eff.id.foo | 
					
						
							|  |  |  | except AttributeError: pass | 
					
						
							|  |  |  | else: raise TestFailed | 
					
						
							| 
									
										
										
										
											2001-01-19 19:55:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Regression test for a crash in pre-2.1a1 | 
					
						
							|  |  |  | def another(): | 
					
						
							|  |  |  |     pass | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     del another.__dict__ | 
					
						
							| 
									
										
										
										
											2001-09-18 03:55:22 +00:00
										 |  |  | except TypeError: pass | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | else: raise TestFailed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     del another.func_dict | 
					
						
							| 
									
										
										
										
											2001-09-18 03:55:22 +00:00
										 |  |  | except TypeError: pass | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | else: raise TestFailed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     another.func_dict = None | 
					
						
							| 
									
										
										
										
											2001-09-18 03:55:22 +00:00
										 |  |  | except TypeError: pass | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | else: raise TestFailed | 
					
						
							| 
									
										
										
										
											2001-01-19 19:55:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     del another.bar | 
					
						
							|  |  |  | except AttributeError: pass | 
					
						
							|  |  |  | else: raise TestFailed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # This isn't specifically related to function attributes, but it does test a | 
					
						
							|  |  |  | # core dump regression in funcobject.c | 
					
						
							|  |  |  | del another.func_defaults | 
					
						
							| 
									
										
										
										
											2001-01-29 06:21:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def foo(): | 
					
						
							| 
									
										
										
										
											2001-02-09 20:17:14 +00:00
										 |  |  |     pass | 
					
						
							| 
									
										
										
										
											2001-01-29 06:21:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def bar(): | 
					
						
							| 
									
										
										
										
											2001-02-09 20:17:14 +00:00
										 |  |  |     pass | 
					
						
							| 
									
										
										
										
											2001-01-29 06:21:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def temp(): | 
					
						
							| 
									
										
										
										
											2001-02-09 20:17:14 +00:00
										 |  |  |     print 1 | 
					
						
							| 
									
										
										
										
											2001-01-29 06:21:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-14 18:28:28 +00:00
										 |  |  | if foo==bar: | 
					
						
							|  |  |  |     raise TestFailed | 
					
						
							| 
									
										
										
										
											2001-01-29 06:21:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | d={} | 
					
						
							|  |  |  | d[foo] = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | foo.func_code = temp.func_code | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | d[foo] | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Test all predefined function attributes systematically | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  | def cantset(obj, name, value): | 
					
						
							|  |  |  |     verify(hasattr(obj, name)) # Otherwise it's probably a typo | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  |         setattr(obj, name, value) | 
					
						
							| 
									
										
										
										
											2001-10-22 02:00:09 +00:00
										 |  |  |     except (AttributeError, TypeError): | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  |         pass | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  |         raise TestFailed, "shouldn't be able to set %s to %r" % (name, value) | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  |         delattr(obj, name) | 
					
						
							| 
									
										
										
										
											2001-10-22 02:00:09 +00:00
										 |  |  |     except (AttributeError, TypeError): | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  |         pass | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  |         raise TestFailed, "shouldn't be able to del %s" % name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_func_closure(): | 
					
						
							|  |  |  |     a = 12 | 
					
						
							|  |  |  |     def f(): print a | 
					
						
							|  |  |  |     c = f.func_closure | 
					
						
							|  |  |  |     verify(isinstance(c, tuple)) | 
					
						
							|  |  |  |     verify(len(c) == 1) | 
					
						
							|  |  |  |     verify(c[0].__class__.__name__ == "cell") # don't have a type object handy | 
					
						
							|  |  |  |     cantset(f, "func_closure", c) | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_func_doc(): | 
					
						
							|  |  |  |     def f(): pass | 
					
						
							|  |  |  |     verify(f.__doc__ is None) | 
					
						
							|  |  |  |     verify(f.func_doc is None) | 
					
						
							|  |  |  |     f.__doc__ = "hello" | 
					
						
							|  |  |  |     verify(f.__doc__ == "hello") | 
					
						
							|  |  |  |     verify(f.func_doc == "hello") | 
					
						
							|  |  |  |     del f.__doc__ | 
					
						
							|  |  |  |     verify(f.__doc__ is None) | 
					
						
							|  |  |  |     verify(f.func_doc is None) | 
					
						
							|  |  |  |     f.func_doc = "world" | 
					
						
							|  |  |  |     verify(f.__doc__ == "world") | 
					
						
							|  |  |  |     verify(f.func_doc == "world") | 
					
						
							|  |  |  |     del f.func_doc | 
					
						
							|  |  |  |     verify(f.func_doc is None) | 
					
						
							|  |  |  |     verify(f.__doc__ is None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_func_globals(): | 
					
						
							|  |  |  |     def f(): pass | 
					
						
							|  |  |  |     verify(f.func_globals is globals()) | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  |     cantset(f, "func_globals", globals()) | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_func_name(): | 
					
						
							|  |  |  |     def f(): pass | 
					
						
							|  |  |  |     verify(f.__name__ == "f") | 
					
						
							|  |  |  |     verify(f.func_name == "f") | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  |     cantset(f, "func_name", "f") | 
					
						
							|  |  |  |     cantset(f, "__name__", "f") | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_func_code(): | 
					
						
							|  |  |  |     def f(): pass | 
					
						
							|  |  |  |     def g(): print 12 | 
					
						
							|  |  |  |     verify(type(f.func_code) is types.CodeType) | 
					
						
							|  |  |  |     f.func_code = g.func_code | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  |     cantset(f, "func_code", None) | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_func_defaults(): | 
					
						
							|  |  |  |     def f(a, b): return (a, b) | 
					
						
							|  |  |  |     verify(f.func_defaults is None) | 
					
						
							|  |  |  |     f.func_defaults = (1, 2) | 
					
						
							|  |  |  |     verify(f.func_defaults == (1, 2)) | 
					
						
							|  |  |  |     verify(f(10) == (10, 2)) | 
					
						
							|  |  |  |     def g(a=1, b=2): return (a, b) | 
					
						
							|  |  |  |     verify(g.func_defaults == (1, 2)) | 
					
						
							|  |  |  |     del g.func_defaults | 
					
						
							|  |  |  |     verify(g.func_defaults is None) | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         g() | 
					
						
							|  |  |  |     except TypeError: | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         raise TestFailed, "shouldn't be allowed to call g() w/o defaults" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_func_dict(): | 
					
						
							|  |  |  |     def f(): pass | 
					
						
							|  |  |  |     a = f.__dict__ | 
					
						
							|  |  |  |     b = f.func_dict | 
					
						
							|  |  |  |     verify(a == {}) | 
					
						
							|  |  |  |     verify(a is b) | 
					
						
							|  |  |  |     f.hello = 'world' | 
					
						
							|  |  |  |     verify(a == {'hello': 'world'}) | 
					
						
							|  |  |  |     verify(f.func_dict is a is f.__dict__) | 
					
						
							|  |  |  |     f.func_dict = {} | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  |     verify(not hasattr(f, "hello")) | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  |     f.__dict__ = {'world': 'hello'} | 
					
						
							|  |  |  |     verify(f.world == "hello") | 
					
						
							|  |  |  |     verify(f.__dict__ is f.func_dict == {'world': 'hello'}) | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  |     cantset(f, "func_dict", None) | 
					
						
							|  |  |  |     cantset(f, "__dict__", None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_im_class(): | 
					
						
							|  |  |  |     class C: | 
					
						
							|  |  |  |         def foo(self): pass | 
					
						
							|  |  |  |     verify(C.foo.im_class is C) | 
					
						
							|  |  |  |     verify(C().foo.im_class is C) | 
					
						
							|  |  |  |     cantset(C.foo, "im_class", C) | 
					
						
							|  |  |  |     cantset(C().foo, "im_class", C) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_im_func(): | 
					
						
							|  |  |  |     def foo(self): pass | 
					
						
							|  |  |  |     class C: | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  |         pass | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  |     C.foo = foo | 
					
						
							|  |  |  |     verify(C.foo.im_func is foo) | 
					
						
							|  |  |  |     verify(C().foo.im_func is foo) | 
					
						
							|  |  |  |     cantset(C.foo, "im_func", foo) | 
					
						
							|  |  |  |     cantset(C().foo, "im_func", foo) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_im_self(): | 
					
						
							|  |  |  |     class C: | 
					
						
							|  |  |  |         def foo(self): pass | 
					
						
							|  |  |  |     verify(C.foo.im_self is None) | 
					
						
							|  |  |  |     c = C() | 
					
						
							|  |  |  |     verify(c.foo.im_self is c) | 
					
						
							|  |  |  |     cantset(C.foo, "im_self", None) | 
					
						
							|  |  |  |     cantset(c.foo, "im_self", c) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_im_dict(): | 
					
						
							|  |  |  |     class C: | 
					
						
							|  |  |  |         def foo(self): pass | 
					
						
							|  |  |  |         foo.bar = 42 | 
					
						
							|  |  |  |     verify(C.foo.__dict__ == {'bar': 42}) | 
					
						
							|  |  |  |     verify(C().foo.__dict__ == {'bar': 42}) | 
					
						
							|  |  |  |     cantset(C.foo, "__dict__", C.foo.__dict__) | 
					
						
							|  |  |  |     cantset(C().foo, "__dict__", C.foo.__dict__) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_im_doc(): | 
					
						
							|  |  |  |     class C: | 
					
						
							|  |  |  |         def foo(self): "hello" | 
					
						
							|  |  |  |     verify(C.foo.__doc__ == "hello") | 
					
						
							|  |  |  |     verify(C().foo.__doc__ == "hello") | 
					
						
							|  |  |  |     cantset(C.foo, "__doc__", "hello") | 
					
						
							|  |  |  |     cantset(C().foo, "__doc__", "hello") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_im_name(): | 
					
						
							|  |  |  |     class C: | 
					
						
							|  |  |  |         def foo(self): pass | 
					
						
							|  |  |  |     verify(C.foo.__name__ == "foo") | 
					
						
							|  |  |  |     verify(C().foo.__name__ == "foo") | 
					
						
							|  |  |  |     cantset(C.foo, "__name__", "foo") | 
					
						
							|  |  |  |     cantset(C().foo, "__name__", "foo") | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def testmore(): | 
					
						
							|  |  |  |     test_func_closure() | 
					
						
							|  |  |  |     test_func_doc() | 
					
						
							|  |  |  |     test_func_globals() | 
					
						
							|  |  |  |     test_func_name() | 
					
						
							|  |  |  |     test_func_code() | 
					
						
							|  |  |  |     test_func_defaults() | 
					
						
							|  |  |  |     test_func_dict() | 
					
						
							| 
									
										
										
										
											2001-09-18 03:28:54 +00:00
										 |  |  |     # Tests for instance method attributes | 
					
						
							|  |  |  |     test_im_class() | 
					
						
							|  |  |  |     test_im_func() | 
					
						
							|  |  |  |     test_im_self() | 
					
						
							|  |  |  |     test_im_dict() | 
					
						
							|  |  |  |     test_im_doc() | 
					
						
							|  |  |  |     test_im_name() | 
					
						
							| 
									
										
										
										
											2001-09-17 23:46:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | testmore() |