1
0
forked from VimPlug/jedi

Merge pull request #148 from tkf/docstring-improvements

Improve docstrings
This commit is contained in:
David Halter
2013-03-03 20:18:58 -08:00
2 changed files with 119 additions and 18 deletions

View File

@@ -87,9 +87,17 @@ import docstrings
def get_defined_names_for_position(scope, position=None, start_scope=None):
"""
Deletes all names that are ahead of the position, except for some special
objects like instances, where the position doesn't matter.
Return filtered version of ``scope.get_defined_names()``.
This function basically does what :meth:`scope.get_defined_names
<parsing_representation.Scope.get_defined_names>` does.
- If `position` is given, delete all names defined after `position`.
- For special objects like instances, `position` is ignored and all
names are returned.
:type scope: :class:`parsing_representation.IsScope`
:param scope: Scope in which names are searched.
:param position: the position as a line/column tuple, default is infinity.
"""
names = scope.get_defined_names()
@@ -112,6 +120,39 @@ def get_names_of_scope(scope, position=None, star_search=True,
Get all completions (names) possible for the current scope.
The star search option is only here to provide an optimization. Otherwise
the whole thing would probably start a little recursive madness.
This function is used to include names from outer scopes. For example,
when the current scope is function:
>>> from jedi.parsing import Parser
>>> parser = Parser('''
... x = ['a', 'b', 'c']
... def func():
... y = None
... ''')
>>> scope = parser.scope.subscopes[0]
>>> scope
<Function: func@3-6>
`get_names_of_scope` is a generator. First it yields names from
most inner scope.
>>> pairs = list(get_names_of_scope(scope))
>>> pairs[0]
(<Function: func@3-6>, [<Name: y@4,4>])
Then it yield the names from one level outer scope. For this
example, this is the most outer scope.
>>> pairs[1]
(<SubModule: None@1-6>, [<Name: x@2,0>, <Name: func@3,4>])
Finally, it yields names from builtin, if `include_builtin` is
true (default).
>>> pairs[2] #doctest: +ELLIPSIS
(<Module: ...builtin...>, [<Name: ...>, ...])
"""
in_func_scope = scope
non_flow = scope.get_parent_until(pr.Flow, reverse=True)

View File

@@ -14,6 +14,25 @@ One special thing:
``[1, 2+33]`` for example would be an Array with two ``Statement`` inside. This
is the easiest way to write a parser. The same behaviour applies to ``Param``,
which is being used in a function definition.
The easiest way to play with this module is to use :class:`parsing.Parser`.
:attr:`parsing.Parser.scope` holds an instance of :class:`SubModule`:
>>> from jedi.parsing import Parser
>>> parser = Parser('import os', 'example.py')
>>> submodule = parser.scope
>>> submodule
<SubModule: example.py@1-2>
Any subclasses of :class:`Scope`, including :class:`SubModule` has
attribute :attr:`imports <Scope.imports>`. This attribute has import
statements in this scope. Check this out:
>>> submodule.imports
[<Import: import os @1,0>]
See also :attr:`Scope.subscopes` and :attr:`Scope.statements`.
"""
import os
@@ -50,6 +69,16 @@ class Simple(Base):
'_end_pos')
def __init__(self, module, start_pos, end_pos=(None, None)):
"""
Initialize :class:`Simple`.
:type module: :class:`SubModule`
:param module: The module in which this Python object locates.
:type start_pos: 2-tuple of int
:param start_pos: Position (line, column) of the Statement.
:type end_pos: 2-tuple of int
:param end_pos: Same as `start_pos`.
"""
self._sub_module = module
self._start_pos = start_pos
self._end_pos = end_pos
@@ -183,7 +212,7 @@ class Scope(Simple, IsScope):
def get_set_vars(self):
"""
Get all the names, that are active and accessible in the current
scope.
scope. See :meth:`get_defined_names` for examples.
:return: list of Name
:rtype: list
@@ -204,6 +233,26 @@ class Scope(Simple, IsScope):
return n
def get_defined_names(self):
"""
Get all defined names in this scope.
>>> from jedi.parsing import Parser
>>> parser = Parser('''
... a = x
... b = y
... b.c = z
... ''')
>>> parser.scope.get_defined_names()
[<Name: a@2,0>, <Name: b@3,0>]
Note that unlike :meth:`get_set_vars`, assignment to object
attribute does not change the result because it does not change
the defined names in this scope.
>>> parser.scope.get_set_vars()
[<Name: a@2,0>, <Name: b@3,0>, <Name: b.c@4,0>]
"""
return [n for n in self.get_set_vars()
if isinstance(n, Import) or len(n) == 1]
@@ -259,12 +308,22 @@ class Module(IsScope):
class SubModule(Scope, Module):
"""
The top scope, which is always a module.
Depending on the underlying parser this may be a full module or just a part
of a module.
"""
def __init__(self, path, start_pos=(1, 0), top_module=None):
"""
Initialize :class:`SubModule`.
:type path: str
:arg path: File path to this module.
.. todo:: Document `top_module`.
"""
super(SubModule, self).__init__(self, start_pos)
self.path = path
self.global_vars = []
@@ -577,9 +636,6 @@ class Import(Simple):
"""
Stores the imports of any Scopes.
>>> 1+1
2
:param start_pos: Position (line, column) of the Import.
:type start_pos: tuple(int, int)
:param namespace: The import, can be empty if a star is given
@@ -663,14 +719,18 @@ class Statement(Simple):
stores pretty much all the Python code, except functions, classes, imports,
and flow functions like if, for, etc.
:type set_vars: list of :class:`Name`
:param set_vars: The variables which are defined by the statement.
:param set_vars: str
:type used_vars: list of :class:`Name`
:param used_vars: The variables which are used by the statement.
:param used_vars: str
:param token_list: Token list which is also peppered with Name.
:param token_list: list
:type token_list: list
:param token_list:
List of tokens or names. Each element is either an instance
of :class:`Name` or a tuple of token type value (e.g.,
:data:`tokenize.NUMBER`), token string (e.g., ``'='``), and
start position (e.g., ``(1, 0)``).
:type start_pos: 2-tuple of int
:param start_pos: Position (line, column) of the Statement.
:type start_pos: tuple(int, int)
"""
__slots__ = ('token_list', 'used_vars',
'set_vars', '_commands', '_assignment_details')
@@ -692,11 +752,11 @@ class Statement(Simple):
def _remove_executions_from_set_vars(self, set_vars):
"""
Important mainly for assosiative arrays:
Important mainly for assosiative arrays::
>>> a = 3
>>> b = {}
>>> b[a] = 3
a = 3
b = {}
b[a] = 3
`a` is in this case not a set_var, it is used to index the dict.
"""