Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
marvel
GitHub Repository: marvel/qnf
Path: blob/master/elisp/emacs-for-python/rope-dist/rope/base/arguments.py
1415 views
1
import rope.base.evaluate
2
from rope.base import ast
3
4
5
class Arguments(object):
6
"""A class for evaluating parameters passed to a function
7
8
You can use the `create_arguments` factory. It handles implicit
9
first arguments.
10
11
"""
12
13
def __init__(self, args, scope):
14
self.args = args
15
self.scope = scope
16
self.instance = None
17
18
def get_arguments(self, parameters):
19
result = []
20
for pyname in self.get_pynames(parameters):
21
if pyname is None:
22
result.append(None)
23
else:
24
result.append(pyname.get_object())
25
return result
26
27
def get_pynames(self, parameters):
28
result = [None] * max(len(parameters), len(self.args))
29
for index, arg in enumerate(self.args):
30
if isinstance(arg, ast.keyword) and arg.arg in parameters:
31
result[parameters.index(arg.arg)] = self._evaluate(arg.value)
32
else:
33
result[index] = self._evaluate(arg)
34
return result
35
36
def get_instance_pyname(self):
37
if self.args:
38
return self._evaluate(self.args[0])
39
40
def _evaluate(self, ast_node):
41
return rope.base.evaluate.eval_node(self.scope, ast_node)
42
43
44
def create_arguments(primary, pyfunction, call_node, scope):
45
"""A factory for creating `Arguments`"""
46
args = list(call_node.args)
47
args.extend(call_node.keywords)
48
called = call_node.func
49
# XXX: Handle constructors
50
if _is_method_call(primary, pyfunction) and \
51
isinstance(called, ast.Attribute):
52
args.insert(0, called.value)
53
return Arguments(args, scope)
54
55
56
class ObjectArguments(object):
57
58
def __init__(self, pynames):
59
self.pynames = pynames
60
61
def get_arguments(self, parameters):
62
result = []
63
for pyname in self.pynames:
64
if pyname is None:
65
result.append(None)
66
else:
67
result.append(pyname.get_object())
68
return result
69
70
def get_pynames(self, parameters):
71
return self.pynames
72
73
def get_instance_pyname(self):
74
return self.pynames[0]
75
class MixedArguments(object):
76
77
def __init__(self, pyname, arguments, scope):
78
"""`argumens` is an instance of `Arguments`"""
79
self.pyname = pyname
80
self.args = arguments
81
82
def get_pynames(self, parameters):
83
return [self.pyname] + self.args.get_pynames(parameters[1:])
84
85
def get_arguments(self, parameters):
86
result = []
87
for pyname in self.get_pynames(parameters):
88
if pyname is None:
89
result.append(None)
90
else:
91
result.append(pyname.get_object())
92
return result
93
94
def get_instance_pyname(self):
95
return self.pyname
96
97
98
def _is_method_call(primary, pyfunction):
99
if primary is None:
100
return False
101
pyobject = primary.get_object()
102
if isinstance(pyobject.get_type(), rope.base.pyobjects.PyClass) and \
103
isinstance(pyfunction, rope.base.pyobjects.PyFunction) and \
104
isinstance(pyfunction.parent, rope.base.pyobjects.PyClass):
105
return True
106
if isinstance(pyobject.get_type(), rope.base.pyobjects.AbstractClass) and \
107
isinstance(pyfunction, rope.base.builtins.BuiltinFunction):
108
return True
109
return False
110
111