Skip to content

Instantly share code, notes, and snippets.

@rhizoome
Created November 13, 2013 16:01
Show Gist options
  • Save rhizoome/7451514 to your computer and use it in GitHub Desktop.
Save rhizoome/7451514 to your computer and use it in GitHub Desktop.
extract_method plan
{
"metadata": {
"name": "deparse - explore jedi parse"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": "import jedi.parser as parser\n\ncode_basic_features = '''\ndef a_function(a_argument, a_default = \"default\"):\n \"\"\"A docstring\"\"\"\n\n a_result = 3 * a_argument\n print(a_result, 3, a_default) # a comment\n if a_default == \"default\":\n return str(a_result)\n else:\n return None\n'''\n",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": "prs = parser.Parser(code_basic_features)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": "import freeze",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": "This is a first test if the jedi parser gives all the information needed for my extract_method refactoring plan, see:\n\nhttps://github.com/ganwell/jedi#brachinfo-deparse\n\n* As it seems parameters aren't listed explicitly\n* Of course comments aren't in the ast"
},
{
"cell_type": "code",
"collapsed": false,
"input": "freeze.freeze(prs)",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": "(('module',\n (('subscopes',\n ((('decorators', ()),\n ('docstr', 'A docstring'),\n ('subscopes', ()),\n ('imports', ()),\n ('listeners', ()),\n ('is_generator', False),\n ('name', <Name: a_function@2,4>),\n ('returns', (<Statement: str(a_result) @8,8>, <Statement: None @10,8>)),\n ('asserts', ()),\n ('statements',\n (<Statement: a_result = 3*a_argument @5,4>,\n <Statement: print(a_result, 3, a_default) @6,4>,\n (('set_vars', ()),\n ('subscopes', ()),\n ('imports', ()),\n ('is_generator', False),\n ('next',\n (('set_vars', ()),\n ('subscopes', ()),\n ('imports', ()),\n ('is_generator', False),\n ('next', None),\n ('returns', ()),\n ('inputs', ()),\n ('asserts', ()),\n ('docstr', ''),\n ('command', 'else'),\n ('statements', ()),\n ('_parent',\n \"<class 'jedi.parser.representation.Function'> at 0x139805689868368\"))),\n ('returns', ()),\n ('inputs', (<Statement: a_default==\"default\" @7,7>,)),\n ('asserts', ()),\n ('docstr', ''),\n ('command', 'if'),\n ('statements', ()),\n ('_parent',\n \"<class 'jedi.parser.representation.Function'> at 0x139805689868368\")))),\n ('params',\n (<Param: a_argument @2,15>, <Param: a_default = \"default\" @2,27>))),)),\n ('imports', ()),\n ('path', None),\n ('is_generator', False),\n ('line_offset', 0),\n ('returns', ()),\n ('asserts', ()),\n ('used_names',\n (('a_default',\n (<Statement: a_default==\"default\" @7,7>,\n <Statement: print(a_result, 3, a_default) @6,4>,\n <Param: a_default = \"default\" @2,27>)),\n ('str', (<Statement: str(a_result) @8,8>,)),\n ('a_result',\n (<Statement: a_result = 3*a_argument @5,4>,\n <Statement: print(a_result, 3, a_default) @6,4>,\n <Statement: str(a_result) @8,8>)),\n ('None', (<Statement: None @10,8>,)),\n ('print', (<Statement: print(a_result, 3, a_default) @6,4>,)),\n ('a_argument',\n (<Param: a_argument @2,15>,\n <Statement: a_result = 3*a_argument @5,4>)))),\n ('docstr', ''),\n ('temp_used_names', ()),\n ('global_vars', ()),\n ('statements', ()),\n ('_name', None))),\n ('start_pos', (1, 0)),\n ('user_scope', None),\n ('user_position', None),\n ('_decorators', ()),\n ('parserline', ''),\n ('freshscope', False),\n ('end_pos', (10, 19)),\n ('no_docstr', False),\n ('top_module',\n \"<class 'jedi.parser.representation.SubModule'> at 0x139805753535200\"),\n ('iterator', \"<class 'jedi.parser.Parser'> at 0x139805754126736\"),\n ('_scope',\n \"<class 'jedi.parser.representation.Function'> at 0x139805689868368\"),\n ('_current', (6, '')),\n ('user_stmt', None))"
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": "freeze.flatten(prs)",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 5,
"text": "['/_current/6/',\n '/_decorators/()',\n \"/_scope/<class 'jedi.parser.representation.Function'> at 0x139805689868368\",\n '/end_pos/10/19',\n '/freshscope/False',\n \"/iterator/<class 'jedi.parser.Parser'> at 0x139805754126736\",\n '/module/_name/None',\n '/module/asserts/()',\n '/module/docstr/',\n '/module/global_vars/()',\n '/module/imports/()',\n '/module/is_generator/False',\n '/module/line_offset/0',\n '/module/path/None',\n '/module/returns/()',\n '/module/statements/()',\n '/module/subscopes/0/asserts/()',\n '/module/subscopes/0/decorators/()',\n '/module/subscopes/0/docstr/A docstring',\n '/module/subscopes/0/imports/()',\n '/module/subscopes/0/is_generator/False',\n '/module/subscopes/0/listeners/()',\n '/module/subscopes/0/name/a_function',\n '/module/subscopes/0/params/<Param: a_argument @2,15>/<Param: a_default = \"default\" @2,27>',\n '/module/subscopes/0/returns/<Statement: str(a_result) @8,8>/<Statement: None @10,8>',\n '/module/subscopes/0/statements/0/<Statement: a_result = 3*a_argument @5,4>',\n '/module/subscopes/0/statements/1/<Statement: print(a_result, 3, a_default) @6,4>',\n \"/module/subscopes/0/statements/2/_parent/<class 'jedi.parser.representation.Function'> at 0x139805689868368\",\n '/module/subscopes/0/statements/2/asserts/()',\n '/module/subscopes/0/statements/2/command/if',\n '/module/subscopes/0/statements/2/docstr/',\n '/module/subscopes/0/statements/2/imports/()',\n '/module/subscopes/0/statements/2/inputs/0/<Statement: a_default==\"default\" @7,7>',\n '/module/subscopes/0/statements/2/is_generator/False',\n \"/module/subscopes/0/statements/2/next/_parent/<class 'jedi.parser.representation.Function'> at 0x139805689868368\",\n '/module/subscopes/0/statements/2/next/asserts/()',\n '/module/subscopes/0/statements/2/next/command/else',\n '/module/subscopes/0/statements/2/next/docstr/',\n '/module/subscopes/0/statements/2/next/imports/()',\n '/module/subscopes/0/statements/2/next/inputs/()',\n '/module/subscopes/0/statements/2/next/is_generator/False',\n '/module/subscopes/0/statements/2/next/next/None',\n '/module/subscopes/0/statements/2/next/returns/()',\n '/module/subscopes/0/statements/2/next/set_vars/()',\n '/module/subscopes/0/statements/2/next/statements/()',\n '/module/subscopes/0/statements/2/next/subscopes/()',\n '/module/subscopes/0/statements/2/returns/()',\n '/module/subscopes/0/statements/2/set_vars/()',\n '/module/subscopes/0/statements/2/statements/()',\n '/module/subscopes/0/statements/2/subscopes/()',\n '/module/subscopes/0/subscopes/()',\n '/module/temp_used_names/()',\n '/module/used_names/None/0/<Statement: None @10,8>',\n '/module/used_names/a_argument/<Param: a_argument @2,15>/<Statement: a_result = 3*a_argument @5,4>',\n '/module/used_names/a_default/0/<Param: a_default = \"default\" @2,27>',\n '/module/used_names/a_default/1/<Statement: a_default==\"default\" @7,7>',\n '/module/used_names/a_default/2/<Statement: print(a_result, 3, a_default) @6,4>',\n '/module/used_names/a_result/0/<Statement: a_result = 3*a_argument @5,4>',\n '/module/used_names/a_result/1/<Statement: print(a_result, 3, a_default) @6,4>',\n '/module/used_names/a_result/2/<Statement: str(a_result) @8,8>',\n '/module/used_names/print/0/<Statement: print(a_result, 3, a_default) @6,4>',\n '/module/used_names/str/0/<Statement: str(a_result) @8,8>',\n '/no_docstr/False',\n '/parserline/',\n '/start_pos/1/0',\n \"/top_module/<class 'jedi.parser.representation.SubModule'> at 0x139805753535200\",\n '/user_position/None',\n '/user_scope/None',\n '/user_stmt/None']"
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Compare to python ast"
},
{
"cell_type": "code",
"collapsed": false,
"input": "import ast",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": "b = ast.parse(code_basic_features)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": "freeze.freeze(b)",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": "(('body',\n ((('body',\n ((('value', (('lineno', 3), ('col_offset', 4), ('s', 'A docstring'))),\n ('lineno', 3),\n ('col_offset', 4)),\n (('value',\n (('lineno', 5),\n ('col_offset', 15),\n ('op', ()),\n ('right',\n (('col_offset', 19),\n ('lineno', 5),\n ('ctx', ()),\n ('id', 'a_argument'))),\n ('left', (('n', 3), ('col_offset', 15), ('lineno', 5))))),\n ('lineno', 5),\n ('col_offset', 4),\n ('targets',\n ((('col_offset', 4),\n ('lineno', 5),\n ('ctx', ()),\n ('id', 'a_result')),))),\n (('value',\n (('lineno', 6),\n ('col_offset', 4),\n ('starargs', None),\n ('kwargs', None),\n ('keywords', ()),\n ('func',\n (('col_offset', 4),\n ('lineno', 6),\n ('ctx', \"<class '_ast.Load'> at 0x139806200038352\"),\n ('id', 'print'))),\n ('args',\n ((('col_offset', 10),\n ('lineno', 6),\n ('ctx', \"<class '_ast.Load'> at 0x139806200038352\"),\n ('id', 'a_result')),\n (('n', 3), ('col_offset', 20), ('lineno', 6)),\n (('col_offset', 23),\n ('lineno', 6),\n ('ctx', \"<class '_ast.Load'> at 0x139806200038352\"),\n ('id', 'a_default')))))),\n ('lineno', 6),\n ('col_offset', 4)),\n (('body',\n ((('value',\n (('lineno', 8),\n ('col_offset', 15),\n ('starargs', None),\n ('kwargs', None),\n ('keywords', ()),\n ('func',\n (('col_offset', 15),\n ('lineno', 8),\n ('ctx', \"<class '_ast.Load'> at 0x139806200038352\"),\n ('id', 'str'))),\n ('args',\n ((('col_offset', 19),\n ('lineno', 8),\n ('ctx', \"<class '_ast.Load'> at 0x139806200038352\"),\n ('id', 'a_result')),)))),\n ('lineno', 8),\n ('col_offset', 8)),)),\n ('lineno', 7),\n ('col_offset', 4),\n ('test',\n (('lineno', 7),\n ('ops', ((),)),\n ('col_offset', 7),\n ('comparators',\n ((('lineno', 7), ('col_offset', 20), ('s', 'default')),)),\n ('left',\n (('col_offset', 7),\n ('lineno', 7),\n ('ctx', \"<class '_ast.Load'> at 0x139806200038352\"),\n ('id', 'a_default'))))),\n ('orelse',\n ((('value',\n (('col_offset', 15),\n ('lineno', 10),\n ('ctx', \"<class '_ast.Load'> at 0x139806200038352\"),\n ('id', 'None'))),\n ('lineno', 10),\n ('col_offset', 8)),))))),\n ('name', 'a_function'),\n ('col_offset', 0),\n ('lineno', 2),\n ('returns', None),\n ('args',\n (('kwargannotation', None),\n ('defaults', ((('lineno', 2), ('col_offset', 39), ('s', 'default')),)),\n ('varargannotation', None),\n ('vararg', None),\n ('kwonlyargs', ()),\n ('args',\n ((('annotation', None), ('arg', 'a_argument')),\n (('annotation', None), ('arg', 'a_default')))),\n ('kwarg', None),\n ('kw_defaults', ()))),\n ('decorator_list', ())),)),)"
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Well no comments either so probably jedi is still the better option."
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment