MCPcopy Create free account
hub / github.com/ipython/ipython / extract_symbols

Function extract_symbols

IPython/core/magics/code.py:84–134  ·  view source on GitHub ↗

Return a tuple (blocks, not_found) where ``blocks`` is a list of code fragments for each symbol parsed from code, and ``not_found`` are symbols not found in the code. For example:: In [1]: code = '''a = 10 ...: def b(): return 42 ...: class A: pa

(code, symbols)

Source from the content-addressed store, hash-verified

82
83
84def extract_symbols(code, symbols):
85 """
86 Return a tuple (blocks, not_found)
87 where ``blocks`` is a list of code fragments
88 for each symbol parsed from code, and ``not_found`` are
89 symbols not found in the code.
90
91 For example::
92
93 In [1]: code = '''a = 10
94 ...: def b(): return 42
95 ...: class A: pass'''
96
97 In [2]: extract_symbols(code, 'A,b,z')
98 Out[2]: (['class A: pass\\n', 'def b(): return 42\\n'], ['z'])
99 """
100 symbols = symbols.split(',')
101
102 # this will raise SyntaxError if code isn't valid Python
103 py_code = ast.parse(code)
104
105 marks = [(getattr(s, 'name', None), s.lineno) for s in py_code.body]
106 code = code.split('\n')
107
108 symbols_lines = {}
109
110 # we already know the start_lineno of each symbol (marks).
111 # To find each end_lineno, we traverse in reverse order until each
112 # non-blank line
113 end = len(code)
114 for name, start in reversed(marks):
115 while not code[end - 1].strip():
116 end -= 1
117 if name:
118 symbols_lines[name] = (start - 1, end)
119 end = start - 1
120
121 # Now symbols_lines is a map
122 # {'symbol_name': (start_lineno, end_lineno), ...}
123
124 # fill a list with chunks of codes for each requested symbol
125 blocks = []
126 not_found = []
127 for symbol in symbols:
128 if symbol in symbols_lines:
129 start, end = symbols_lines[symbol]
130 blocks.append('\n'.join(code[start:end]) + '\n')
131 else:
132 not_found.append(symbol)
133
134 return blocks, not_found
135
136def strip_initial_indent(lines):
137 """For %load, strip indent from lines until finding an unindented line.

Callers 1

loadMethod · 0.85

Calls 1

parseMethod · 0.45

Tested by

no test coverage detected