diff options
| -rw-r--r-- | rebuilder.py | 7 | ||||
| -rw-r--r-- | test/unittest_builder.py | 15 |
2 files changed, 19 insertions, 3 deletions
diff --git a/rebuilder.py b/rebuilder.py index b7378709..f46640a2 100644 --- a/rebuilder.py +++ b/rebuilder.py @@ -158,7 +158,6 @@ class RebuildVisitor(ASTVisitor): # no base classes, detect new / style old style according to # current scope node._newstyle = metaclass == 'type' - node.basenames = [as_string(bnode) for bnode in node.bases] leave_classdef = leave_class @@ -262,8 +261,6 @@ class RebuildVisitor(ASTVisitor): self._add_local(node, node.name) visit_delname = visit_assname - # # delayed methods - def delayed_visit_assattr(self, node): """visit a AssAttr node -> add name to locals, handle members definition @@ -277,6 +274,10 @@ class RebuildVisitor(ASTVisitor): if infered.__class__ is nodes.Instance: infered = infered._proxied iattrs = infered.instance_attrs + elif isinstance(infered, nodes.Instance): + # Const, Tuple, ... we may be wrong, may be not, but + # anyway we don't want to pollute builtin's namespace + continue else: iattrs = infered.locals except AttributeError: diff --git a/test/unittest_builder.py b/test/unittest_builder.py index 42eeb67d..deff2957 100644 --- a/test/unittest_builder.py +++ b/test/unittest_builder.py @@ -505,6 +505,21 @@ A.ass_type = A_ass_type def test_dumb_module(self): astng = self.builder.string_build("pouet") + + def test_infered_dont_pollute(self): + code = ''' +def func(a=None): + a.custom_attr = 0 +def func2(a={}): + a.custom_attr = 0 + ''' + astng = self.builder.string_build(code) + nonetype = nodes.const_factory(None) + self.failIf('custom_attr' in nonetype.locals) + self.failIf('custom_attr' in nonetype.instance_attrs) + nonetype = nodes.const_factory({}) + self.failIf('custom_attr' in nonetype.locals) + self.failIf('custom_attr' in nonetype.instance_attrs) if __name__ == '__main__': unittest_main() |
