summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSylvain Th?nault <thenault@gmail.com>2014-04-17 17:28:23 +0200
committerSylvain Th?nault <thenault@gmail.com>2014-04-17 17:28:23 +0200
commit8776dc6409cdc342ef25d48260627ad0a2f644c9 (patch)
treef9c3736f64e4b28b4bccca1b97cb7c050d5198eb
parent79e90f7b56ade2b29abc2d404fc7f7a02263f047 (diff)
parentd8a9ed2c924a65e0ff2185ab4be8d1e1b73087ce (diff)
downloadastroid-8776dc6409cdc342ef25d48260627ad0a2f644c9.tar.gz
Merged in PCManticore/astroid/ancestors (pull request #29)
Unwrap instances found in `.ancestors()`, by using their _proxied class. Don't inherit the metaclass status if the current class can't be a metaclass.
-rw-r--r--inference.py5
-rw-r--r--test/unittest_inference.py36
2 files changed, 41 insertions, 0 deletions
diff --git a/inference.py b/inference.py
index 29c97be..35cce33 100644
--- a/inference.py
+++ b/inference.py
@@ -72,6 +72,11 @@ class CallContext:
return iter((boundnode,))
if funcnode.type == 'classmethod':
return iter((boundnode,))
+ # if we have a method, extract one position
+ # from the index, so we'll take in account
+ # the extra parameter represented by `self` or `cls`
+ if funcnode.type in ('method', 'classmethod'):
+ argindex -= 1
# 2. search arg index
try:
return self.args[argindex].infer(context)
diff --git a/test/unittest_inference.py b/test/unittest_inference.py
index ce02f99..c417e1a 100644
--- a/test/unittest_inference.py
+++ b/test/unittest_inference.py
@@ -1183,6 +1183,42 @@ B = namedtuple('B', 'a b')
self.assertIn('a', bclass.instance_attrs)
self.assertIn('b', bclass.instance_attrs)
+ def test_infer_arguments(self):
+ code = '''
+class A(object):
+ def first(self, arg1, arg2):
+ return arg1
+ @classmethod
+ def method(cls, arg1, arg2):
+ return arg2
+ @classmethod
+ def empty(cls):
+ return 2
+ @staticmethod
+ def static(arg1, arg2):
+ return arg1
+ def empty_method(self):
+ return []
+x = A().first(1, [])
+y = A.method(1, [])
+z = A.static(1, [])
+empty = A.empty()
+empty_list = A().empty_method()
+ '''
+ astroid = builder.string_build(code, __name__, __file__)
+ int_node = astroid['x'].infered()[0]
+ self.assertIsInstance(int_node, nodes.Const)
+ self.assertEqual(int_node.value, 1)
+ list_node = astroid['y'].infered()[0]
+ self.assertIsInstance(list_node, nodes.List)
+ int_node = astroid['z'].infered()[0]
+ self.assertIsInstance(int_node, nodes.Const)
+ self.assertEqual(int_node.value, 1)
+ empty = astroid['empty'].infered()[0]
+ self.assertIsInstance(empty, nodes.Const)
+ self.assertEqual(empty.value, 2)
+ empty_list = astroid['empty_list'].infered()[0]
+ self.assertIsInstance(empty_list, nodes.List)
if __name__ == '__main__':
unittest_main()