Dump function definition, doc string, and function body. This code is specialied for Python 2.
(self, node, is_lambda, nested=1, code_node=None)
| 34 | |
| 35 | |
| 36 | def make_function2(self, node, is_lambda, nested=1, code_node=None): |
| 37 | """ |
| 38 | Dump function definition, doc string, and function body. |
| 39 | This code is specialied for Python 2. |
| 40 | """ |
| 41 | |
| 42 | def build_param(ast, name, default): |
| 43 | """build parameters: |
| 44 | - handle defaults |
| 45 | - handle format tuple parameters |
| 46 | """ |
| 47 | # if formal parameter is a tuple, the parameter name |
| 48 | # starts with a dot (eg. '.1', '.2') |
| 49 | if name.startswith("."): |
| 50 | # replace the name with the tuple-string |
| 51 | name = self.get_tuple_parameter(ast, name) |
| 52 | pass |
| 53 | |
| 54 | if default: |
| 55 | value = self.traverse(default, indent="") |
| 56 | result = "%s=%s" % (name, value) |
| 57 | if result[-2:] == "= ": # default was 'LOAD_CONST None' |
| 58 | result += "None" |
| 59 | return result |
| 60 | else: |
| 61 | return name |
| 62 | |
| 63 | # MAKE_FUNCTION_... or MAKE_CLOSURE_... |
| 64 | assert node[-1].kind.startswith("MAKE_") |
| 65 | |
| 66 | args_node = node[-1] |
| 67 | if isinstance(args_node.attr, tuple): |
| 68 | # positional args are after kwargs |
| 69 | defparams = node[1 : args_node.attr[0] + 1] |
| 70 | pos_args, kw_args, annotate_argc = args_node.attr |
| 71 | else: |
| 72 | defparams = node[: args_node.attr] |
| 73 | kw_args = 0 |
| 74 | pass |
| 75 | |
| 76 | lambda_index = None |
| 77 | |
| 78 | if lambda_index and is_lambda and iscode(node[lambda_index].attr): |
| 79 | assert node[lambda_index].kind == "LOAD_LAMBDA" |
| 80 | code = node[lambda_index].attr |
| 81 | else: |
| 82 | code = code_node.attr |
| 83 | |
| 84 | assert iscode(code) |
| 85 | code = Code(code, self.scanner, self.currentclass) |
| 86 | |
| 87 | # add defaults values to parameter names |
| 88 | argc = code.co_argcount |
| 89 | paramnames = list(code.co_varnames[:argc]) |
| 90 | |
| 91 | # defaults are for last n parameters, thus reverse |
| 92 | paramnames.reverse() |
| 93 | defparams.reverse() |
no test coverage detected