Merge pull request #1391 from markshannon/python-points-to-varargs

Python points to varargs
This commit is contained in:
Taus
2019-06-05 20:17:01 +02:00
committed by GitHub
13 changed files with 376 additions and 21 deletions

View File

@@ -16,6 +16,13 @@
| l_calls.py:10 | ControlFlowNode for bar() | bar |
| l_calls.py:24 | ControlFlowNode for Attribute() | Owner.cm |
| l_calls.py:25 | ControlFlowNode for Attribute() | Owner.cm2 |
| l_calls.py:37 | ControlFlowNode for f() | f |
| l_calls.py:38 | ControlFlowNode for Attribute() | E.m |
| l_calls.py:39 | ControlFlowNode for Attribute() | E.m |
| l_calls.py:42 | ControlFlowNode for f() | f |
| l_calls.py:51 | ControlFlowNode for g() | g |
| l_calls.py:52 | ControlFlowNode for Attribute() | F.m |
| l_calls.py:53 | ControlFlowNode for Attribute() | F.m |
| q_super.py:4 | ControlFlowNode for Attribute() | object.__init__ |
| q_super.py:12 | ControlFlowNode for Attribute() | Base2.__init__ |
| q_super.py:22 | ControlFlowNode for Attribute() | Base1.meth |

View File

@@ -112,12 +112,19 @@
| k_getsetattr.py:0 | Module code.k_getsetattr | k | Function k |
| k_getsetattr.py:4 | Class C | meth1 | Function meth1 |
| k_getsetattr.py:4 | Class C | meth2 | Function meth2 |
| l_calls.py:0 | Module code.l_calls | E | class E |
| l_calls.py:0 | Module code.l_calls | F | class F |
| l_calls.py:0 | Module code.l_calls | Owner | class Owner |
| l_calls.py:0 | Module code.l_calls | bar | Function bar |
| l_calls.py:0 | Module code.l_calls | f | Function f |
| l_calls.py:0 | Module code.l_calls | foo | Function foo |
| l_calls.py:0 | Module code.l_calls | g | Function g |
| l_calls.py:0 | Module code.l_calls | t | Tuple |
| l_calls.py:12 | Class Owner | cm | classmethod() |
| l_calls.py:12 | Class Owner | cm2 | classmethod() |
| l_calls.py:12 | Class Owner | m | Function m |
| l_calls.py:32 | Class E | m | Function m |
| l_calls.py:47 | Class F | m | Function m |
| o_no_returns.py:0 | Module code.o_no_returns | bar | Function bar |
| o_no_returns.py:0 | Module code.o_no_returns | fail | Function fail |
| o_no_returns.py:0 | Module code.o_no_returns | foo | Function foo |

View File

@@ -75,6 +75,7 @@
| k_getsetattr.py:15 | ControlFlowNode for Attribute() | 6 |
| l_calls.py:4 | ControlFlowNode for Attribute() | 4 |
| l_calls.py:9 | ControlFlowNode for foo() | 4 |
| l_calls.py:48 | ControlFlowNode for None | 48 |
| m_attributes.py:12 | ControlFlowNode for Attribute() | 8 |
| m_attributes.py:13 | ControlFlowNode for Attribute() | 8 |
| o_no_returns.py:7 | ControlFlowNode for fail() | 10 |

View File

@@ -598,6 +598,73 @@ WARNING: Predicate points_to has been deprecated and may be removed in future (P
| l_calls.py:25 | ControlFlowNode for Attribute() | int 1 | builtin-class int | 25 | runtime |
| l_calls.py:25 | ControlFlowNode for IntegerLiteral | int 1 | builtin-class int | 25 | runtime |
| l_calls.py:25 | ControlFlowNode for a | class Owner | builtin-class type | 12 | runtime |
| l_calls.py:29 | ControlFlowNode for FunctionExpr | Function f | builtin-class function | 29 | import |
| l_calls.py:29 | ControlFlowNode for args | args | builtin-class tuple | 29 | runtime |
| l_calls.py:29 | ControlFlowNode for f | Function f | builtin-class function | 29 | import |
| l_calls.py:30 | ControlFlowNode for args | args | builtin-class tuple | 29 | code/l_calls.py:37 from import |
| l_calls.py:30 | ControlFlowNode for args | args | builtin-class tuple | 29 | code/l_calls.py:42 from import |
| l_calls.py:30 | ControlFlowNode for args | args | builtin-class tuple | 29 | runtime |
| l_calls.py:32 | ControlFlowNode for ClassExpr | class E | builtin-class type | 32 | import |
| l_calls.py:32 | ControlFlowNode for E | class E | builtin-class type | 32 | import |
| l_calls.py:32 | ControlFlowNode for object | builtin-class object | builtin-class type | 32 | import |
| l_calls.py:33 | ControlFlowNode for FunctionExpr | Function m | builtin-class function | 33 | import |
| l_calls.py:33 | ControlFlowNode for args | args | builtin-class tuple | 33 | runtime |
| l_calls.py:33 | ControlFlowNode for m | Function m | builtin-class function | 33 | import |
| l_calls.py:34 | ControlFlowNode for self | E() | class E | 38 | code/l_calls.py:38 from import |
| l_calls.py:34 | ControlFlowNode for self | int 3 | builtin-class int | 39 | code/l_calls.py:39 from import |
| l_calls.py:34 | ControlFlowNode for self | self | class E | 33 | runtime |
| l_calls.py:35 | ControlFlowNode for args | args | builtin-class tuple | 33 | code/l_calls.py:38 from import |
| l_calls.py:35 | ControlFlowNode for args | args | builtin-class tuple | 33 | code/l_calls.py:39 from import |
| l_calls.py:35 | ControlFlowNode for args | args | builtin-class tuple | 33 | runtime |
| l_calls.py:37 | ControlFlowNode for IntegerLiteral | int 1 | builtin-class int | 37 | import |
| l_calls.py:37 | ControlFlowNode for IntegerLiteral | int 2 | builtin-class int | 37 | import |
| l_calls.py:37 | ControlFlowNode for IntegerLiteral | int 3 | builtin-class int | 37 | import |
| l_calls.py:37 | ControlFlowNode for f | Function f | builtin-class function | 29 | import |
| l_calls.py:37 | ControlFlowNode for f() | args | builtin-class tuple | 29 | import |
| l_calls.py:38 | ControlFlowNode for Attribute | Attribute | builtin-class method | 38 | import |
| l_calls.py:38 | ControlFlowNode for Attribute() | args | builtin-class tuple | 33 | import |
| l_calls.py:38 | ControlFlowNode for E | class E | builtin-class type | 32 | import |
| l_calls.py:38 | ControlFlowNode for E() | E() | class E | 38 | import |
| l_calls.py:38 | ControlFlowNode for IntegerLiteral | int 2 | builtin-class int | 38 | import |
| l_calls.py:38 | ControlFlowNode for IntegerLiteral | int 3 | builtin-class int | 38 | import |
| l_calls.py:38 | ControlFlowNode for IntegerLiteral | int 4 | builtin-class int | 38 | import |
| l_calls.py:39 | ControlFlowNode for Attribute | Function m | builtin-class function | 33 | import |
| l_calls.py:39 | ControlFlowNode for Attribute() | args | builtin-class tuple | 33 | import |
| l_calls.py:39 | ControlFlowNode for E | class E | builtin-class type | 32 | import |
| l_calls.py:39 | ControlFlowNode for IntegerLiteral | int 3 | builtin-class int | 39 | import |
| l_calls.py:39 | ControlFlowNode for IntegerLiteral | int 4 | builtin-class int | 39 | import |
| l_calls.py:39 | ControlFlowNode for IntegerLiteral | int 5 | builtin-class int | 39 | import |
| l_calls.py:41 | ControlFlowNode for Str | 'a' | builtin-class str | 41 | import |
| l_calls.py:41 | ControlFlowNode for Str | 'b' | builtin-class str | 41 | import |
| l_calls.py:41 | ControlFlowNode for Str | 'c' | builtin-class str | 41 | import |
| l_calls.py:41 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 41 | import |
| l_calls.py:41 | ControlFlowNode for t | Tuple | builtin-class tuple | 41 | import |
| l_calls.py:42 | ControlFlowNode for f | Function f | builtin-class function | 29 | import |
| l_calls.py:42 | ControlFlowNode for f() | args | builtin-class tuple | 29 | import |
| l_calls.py:42 | ControlFlowNode for t | Tuple | builtin-class tuple | 41 | import |
| l_calls.py:44 | ControlFlowNode for FunctionExpr | Function g | builtin-class function | 44 | import |
| l_calls.py:44 | ControlFlowNode for g | Function g | builtin-class function | 44 | import |
| l_calls.py:45 | ControlFlowNode for a | 'a' | builtin-class str | 51 | code/l_calls.py:51 from import |
| l_calls.py:47 | ControlFlowNode for ClassExpr | class F | builtin-class type | 47 | import |
| l_calls.py:47 | ControlFlowNode for F | class F | builtin-class type | 47 | import |
| l_calls.py:47 | ControlFlowNode for object | builtin-class object | builtin-class type | 47 | import |
| l_calls.py:48 | ControlFlowNode for FunctionExpr | Function m | builtin-class function | 48 | import |
| l_calls.py:48 | ControlFlowNode for None | NoneType None | builtin-class NoneType | 48 | import |
| l_calls.py:48 | ControlFlowNode for m | Function m | builtin-class function | 48 | import |
| l_calls.py:49 | ControlFlowNode for x | 'a' | builtin-class str | 52 | code/l_calls.py:52 from import |
| l_calls.py:49 | ControlFlowNode for x | 'b' | builtin-class str | 53 | code/l_calls.py:53 from import |
| l_calls.py:51 | ControlFlowNode for g | Function g | builtin-class function | 44 | import |
| l_calls.py:51 | ControlFlowNode for g() | 'a' | builtin-class str | 51 | import |
| l_calls.py:51 | ControlFlowNode for t | Tuple | builtin-class tuple | 41 | import |
| l_calls.py:52 | ControlFlowNode for Attribute | Attribute | builtin-class method | 52 | import |
| l_calls.py:52 | ControlFlowNode for Attribute() | 'a' | builtin-class str | 52 | import |
| l_calls.py:52 | ControlFlowNode for F | class F | builtin-class type | 47 | import |
| l_calls.py:52 | ControlFlowNode for F() | F() | class F | 52 | import |
| l_calls.py:52 | ControlFlowNode for t | Tuple | builtin-class tuple | 41 | import |
| l_calls.py:53 | ControlFlowNode for Attribute | Function m | builtin-class function | 48 | import |
| l_calls.py:53 | ControlFlowNode for Attribute() | 'b' | builtin-class str | 53 | import |
| l_calls.py:53 | ControlFlowNode for F | class F | builtin-class type | 47 | import |
| l_calls.py:53 | ControlFlowNode for t | Tuple | builtin-class tuple | 41 | import |
| m_attributes.py:3 | ControlFlowNode for C | class C | builtin-class type | 3 | import |
| m_attributes.py:3 | ControlFlowNode for ClassExpr | class C | builtin-class type | 3 | import |
| m_attributes.py:3 | ControlFlowNode for object | builtin-class object | builtin-class type | 3 | import |

View File

@@ -675,6 +675,69 @@ WARNING: Predicate points_to has been deprecated and may be removed in future (P
| l_calls.py:25 | ControlFlowNode for Attribute() | int 1 | builtin-class int | 25 |
| l_calls.py:25 | ControlFlowNode for IntegerLiteral | int 1 | builtin-class int | 25 |
| l_calls.py:25 | ControlFlowNode for a | class Owner | builtin-class type | 12 |
| l_calls.py:29 | ControlFlowNode for FunctionExpr | Function f | builtin-class function | 29 |
| l_calls.py:29 | ControlFlowNode for args | args | builtin-class tuple | 29 |
| l_calls.py:29 | ControlFlowNode for f | Function f | builtin-class function | 29 |
| l_calls.py:30 | ControlFlowNode for args | args | builtin-class tuple | 29 |
| l_calls.py:32 | ControlFlowNode for ClassExpr | class E | builtin-class type | 32 |
| l_calls.py:32 | ControlFlowNode for E | class E | builtin-class type | 32 |
| l_calls.py:32 | ControlFlowNode for object | builtin-class object | builtin-class type | 32 |
| l_calls.py:33 | ControlFlowNode for FunctionExpr | Function m | builtin-class function | 33 |
| l_calls.py:33 | ControlFlowNode for args | args | builtin-class tuple | 33 |
| l_calls.py:33 | ControlFlowNode for m | Function m | builtin-class function | 33 |
| l_calls.py:34 | ControlFlowNode for self | E() | class E | 38 |
| l_calls.py:34 | ControlFlowNode for self | int 3 | builtin-class int | 39 |
| l_calls.py:34 | ControlFlowNode for self | self | class E | 33 |
| l_calls.py:35 | ControlFlowNode for args | args | builtin-class tuple | 33 |
| l_calls.py:37 | ControlFlowNode for IntegerLiteral | int 1 | builtin-class int | 37 |
| l_calls.py:37 | ControlFlowNode for IntegerLiteral | int 2 | builtin-class int | 37 |
| l_calls.py:37 | ControlFlowNode for IntegerLiteral | int 3 | builtin-class int | 37 |
| l_calls.py:37 | ControlFlowNode for f | Function f | builtin-class function | 29 |
| l_calls.py:37 | ControlFlowNode for f() | args | builtin-class tuple | 29 |
| l_calls.py:38 | ControlFlowNode for Attribute | Attribute | builtin-class method | 38 |
| l_calls.py:38 | ControlFlowNode for Attribute() | args | builtin-class tuple | 33 |
| l_calls.py:38 | ControlFlowNode for E | class E | builtin-class type | 32 |
| l_calls.py:38 | ControlFlowNode for E() | E() | class E | 38 |
| l_calls.py:38 | ControlFlowNode for IntegerLiteral | int 2 | builtin-class int | 38 |
| l_calls.py:38 | ControlFlowNode for IntegerLiteral | int 3 | builtin-class int | 38 |
| l_calls.py:38 | ControlFlowNode for IntegerLiteral | int 4 | builtin-class int | 38 |
| l_calls.py:39 | ControlFlowNode for Attribute | Function m | builtin-class function | 33 |
| l_calls.py:39 | ControlFlowNode for Attribute() | args | builtin-class tuple | 33 |
| l_calls.py:39 | ControlFlowNode for E | class E | builtin-class type | 32 |
| l_calls.py:39 | ControlFlowNode for IntegerLiteral | int 3 | builtin-class int | 39 |
| l_calls.py:39 | ControlFlowNode for IntegerLiteral | int 4 | builtin-class int | 39 |
| l_calls.py:39 | ControlFlowNode for IntegerLiteral | int 5 | builtin-class int | 39 |
| l_calls.py:41 | ControlFlowNode for Str | 'a' | builtin-class str | 41 |
| l_calls.py:41 | ControlFlowNode for Str | 'b' | builtin-class str | 41 |
| l_calls.py:41 | ControlFlowNode for Str | 'c' | builtin-class str | 41 |
| l_calls.py:41 | ControlFlowNode for Tuple | Tuple | builtin-class tuple | 41 |
| l_calls.py:41 | ControlFlowNode for t | Tuple | builtin-class tuple | 41 |
| l_calls.py:42 | ControlFlowNode for f | Function f | builtin-class function | 29 |
| l_calls.py:42 | ControlFlowNode for f() | args | builtin-class tuple | 29 |
| l_calls.py:42 | ControlFlowNode for t | Tuple | builtin-class tuple | 41 |
| l_calls.py:44 | ControlFlowNode for FunctionExpr | Function g | builtin-class function | 44 |
| l_calls.py:44 | ControlFlowNode for g | Function g | builtin-class function | 44 |
| l_calls.py:45 | ControlFlowNode for a | 'a' | builtin-class str | 51 |
| l_calls.py:47 | ControlFlowNode for ClassExpr | class F | builtin-class type | 47 |
| l_calls.py:47 | ControlFlowNode for F | class F | builtin-class type | 47 |
| l_calls.py:47 | ControlFlowNode for object | builtin-class object | builtin-class type | 47 |
| l_calls.py:48 | ControlFlowNode for FunctionExpr | Function m | builtin-class function | 48 |
| l_calls.py:48 | ControlFlowNode for None | NoneType None | builtin-class NoneType | 48 |
| l_calls.py:48 | ControlFlowNode for m | Function m | builtin-class function | 48 |
| l_calls.py:49 | ControlFlowNode for x | 'a' | builtin-class str | 52 |
| l_calls.py:49 | ControlFlowNode for x | 'b' | builtin-class str | 53 |
| l_calls.py:51 | ControlFlowNode for g | Function g | builtin-class function | 44 |
| l_calls.py:51 | ControlFlowNode for g() | 'a' | builtin-class str | 51 |
| l_calls.py:51 | ControlFlowNode for t | Tuple | builtin-class tuple | 41 |
| l_calls.py:52 | ControlFlowNode for Attribute | Attribute | builtin-class method | 52 |
| l_calls.py:52 | ControlFlowNode for Attribute() | 'a' | builtin-class str | 52 |
| l_calls.py:52 | ControlFlowNode for F | class F | builtin-class type | 47 |
| l_calls.py:52 | ControlFlowNode for F() | F() | class F | 52 |
| l_calls.py:52 | ControlFlowNode for t | Tuple | builtin-class tuple | 41 |
| l_calls.py:53 | ControlFlowNode for Attribute | Function m | builtin-class function | 48 |
| l_calls.py:53 | ControlFlowNode for Attribute() | 'b' | builtin-class str | 53 |
| l_calls.py:53 | ControlFlowNode for F | class F | builtin-class type | 47 |
| l_calls.py:53 | ControlFlowNode for t | Tuple | builtin-class tuple | 41 |
| s_scopes.py:4 | ControlFlowNode for True | bool True | builtin-class bool | 4 |
| s_scopes.py:4 | ControlFlowNode for float | bool True | builtin-class bool | 4 |
| s_scopes.py:7 | ControlFlowNode for C2 | class C2 | builtin-class type | 7 |

View File

@@ -466,6 +466,64 @@
| l_calls.py:25 | ControlFlowNode for Attribute() | runtime | int 1 | builtin-class int |
| l_calls.py:25 | ControlFlowNode for IntegerLiteral | runtime | int 1 | builtin-class int |
| l_calls.py:25 | ControlFlowNode for a | runtime | class Owner | builtin-class type |
| l_calls.py:29 | ControlFlowNode for FunctionExpr | import | Function f | builtin-class function |
| l_calls.py:30 | ControlFlowNode for args | code/l_calls.py:37 from import | (int 1, int 2, int 3, ) | builtin-class tuple |
| l_calls.py:30 | ControlFlowNode for args | code/l_calls.py:42 from import | ('a', 'b', 'c', ) | builtin-class tuple |
| l_calls.py:30 | ControlFlowNode for args | runtime | instance of tuple | builtin-class tuple |
| l_calls.py:32 | ControlFlowNode for ClassExpr | import | class E | builtin-class type |
| l_calls.py:32 | ControlFlowNode for object | import | builtin-class object | builtin-class type |
| l_calls.py:33 | ControlFlowNode for FunctionExpr | import | Function E.m | builtin-class function |
| l_calls.py:34 | ControlFlowNode for self | code/l_calls.py:38 from import | E() | class E |
| l_calls.py:34 | ControlFlowNode for self | code/l_calls.py:39 from import | int 3 | builtin-class int |
| l_calls.py:34 | ControlFlowNode for self | runtime | self instance of E | class E |
| l_calls.py:35 | ControlFlowNode for args | code/l_calls.py:38 from import | (int 2, int 3, int 4, ) | builtin-class tuple |
| l_calls.py:35 | ControlFlowNode for args | code/l_calls.py:39 from import | (int 4, int 5, ) | builtin-class tuple |
| l_calls.py:35 | ControlFlowNode for args | runtime | instance of tuple | builtin-class tuple |
| l_calls.py:37 | ControlFlowNode for IntegerLiteral | import | int 1 | builtin-class int |
| l_calls.py:37 | ControlFlowNode for IntegerLiteral | import | int 2 | builtin-class int |
| l_calls.py:37 | ControlFlowNode for IntegerLiteral | import | int 3 | builtin-class int |
| l_calls.py:37 | ControlFlowNode for f | import | Function f | builtin-class function |
| l_calls.py:37 | ControlFlowNode for f() | import | (int 1, int 2, int 3, ) | builtin-class tuple |
| l_calls.py:38 | ControlFlowNode for Attribute | import | Method(Function E.m, E()) | builtin-class method |
| l_calls.py:38 | ControlFlowNode for Attribute() | import | (int 2, int 3, int 4, ) | builtin-class tuple |
| l_calls.py:38 | ControlFlowNode for E | import | class E | builtin-class type |
| l_calls.py:38 | ControlFlowNode for E() | import | E() | class E |
| l_calls.py:38 | ControlFlowNode for IntegerLiteral | import | int 2 | builtin-class int |
| l_calls.py:38 | ControlFlowNode for IntegerLiteral | import | int 3 | builtin-class int |
| l_calls.py:38 | ControlFlowNode for IntegerLiteral | import | int 4 | builtin-class int |
| l_calls.py:39 | ControlFlowNode for Attribute | import | Function E.m | builtin-class function |
| l_calls.py:39 | ControlFlowNode for Attribute() | import | (int 4, int 5, ) | builtin-class tuple |
| l_calls.py:39 | ControlFlowNode for E | import | class E | builtin-class type |
| l_calls.py:39 | ControlFlowNode for IntegerLiteral | import | int 3 | builtin-class int |
| l_calls.py:39 | ControlFlowNode for IntegerLiteral | import | int 4 | builtin-class int |
| l_calls.py:39 | ControlFlowNode for IntegerLiteral | import | int 5 | builtin-class int |
| l_calls.py:41 | ControlFlowNode for Str | import | 'a' | builtin-class str |
| l_calls.py:41 | ControlFlowNode for Str | import | 'b' | builtin-class str |
| l_calls.py:41 | ControlFlowNode for Str | import | 'c' | builtin-class str |
| l_calls.py:41 | ControlFlowNode for Tuple | import | ('a', 'b', 'c', ) | builtin-class tuple |
| l_calls.py:42 | ControlFlowNode for f | import | Function f | builtin-class function |
| l_calls.py:42 | ControlFlowNode for f() | import | ('a', 'b', 'c', ) | builtin-class tuple |
| l_calls.py:42 | ControlFlowNode for t | import | ('a', 'b', 'c', ) | builtin-class tuple |
| l_calls.py:44 | ControlFlowNode for FunctionExpr | import | Function g | builtin-class function |
| l_calls.py:45 | ControlFlowNode for a | code/l_calls.py:51 from import | 'a' | builtin-class str |
| l_calls.py:47 | ControlFlowNode for ClassExpr | import | class F | builtin-class type |
| l_calls.py:47 | ControlFlowNode for object | import | builtin-class object | builtin-class type |
| l_calls.py:48 | ControlFlowNode for FunctionExpr | import | Function F.m | builtin-class function |
| l_calls.py:48 | ControlFlowNode for None | import | None | builtin-class NoneType |
| l_calls.py:49 | ControlFlowNode for x | code/l_calls.py:52 from import | 'a' | builtin-class str |
| l_calls.py:49 | ControlFlowNode for x | code/l_calls.py:53 from import | 'b' | builtin-class str |
| l_calls.py:51 | ControlFlowNode for g | import | Function g | builtin-class function |
| l_calls.py:51 | ControlFlowNode for g() | import | 'a' | builtin-class str |
| l_calls.py:51 | ControlFlowNode for t | import | ('a', 'b', 'c', ) | builtin-class tuple |
| l_calls.py:52 | ControlFlowNode for Attribute | import | Method(Function F.m, F()) | builtin-class method |
| l_calls.py:52 | ControlFlowNode for Attribute() | import | 'a' | builtin-class str |
| l_calls.py:52 | ControlFlowNode for F | import | class F | builtin-class type |
| l_calls.py:52 | ControlFlowNode for F() | import | F() | class F |
| l_calls.py:52 | ControlFlowNode for t | import | ('a', 'b', 'c', ) | builtin-class tuple |
| l_calls.py:53 | ControlFlowNode for Attribute | import | Function F.m | builtin-class function |
| l_calls.py:53 | ControlFlowNode for Attribute() | import | 'b' | builtin-class str |
| l_calls.py:53 | ControlFlowNode for F | import | class F | builtin-class type |
| l_calls.py:53 | ControlFlowNode for t | import | ('a', 'b', 'c', ) | builtin-class tuple |
| m_attributes.py:3 | ControlFlowNode for ClassExpr | import | class C | builtin-class type |
| m_attributes.py:3 | ControlFlowNode for object | import | builtin-class object | builtin-class type |
| m_attributes.py:5 | ControlFlowNode for FunctionExpr | import | Function C.__init__ | builtin-class function |

View File

@@ -24,3 +24,31 @@ class Owner(object):
a = self.cm(0)
return a.cm2(1)
# *args
def f(*args):
return args
class E(object):
def m(self, *args):
self
return args
f(1, 2, 3)
E().m(2, 3, 4)
E.m(3, 4, 5)
t = 'a', 'b', 'c'
f(*t)
def g(a, b, c):
return a
class F(object):
def m(self, x, y, z=None):
return x
g(*t)
F().m(*t)
F.m(*t)