| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895 |
- """
- There are a couple of classes documented in here:
- - :class:`.BaseName` as an abstact base class for almost everything.
- - :class:`.Name` used in a lot of places
- - :class:`.Completion` for completions
- - :class:`.BaseSignature` as a base class for signatures
- - :class:`.Signature` for :meth:`.Script.get_signatures` only
- - :class:`.ParamName` used for parameters of signatures
- - :class:`.Refactoring` for refactorings
- - :class:`.SyntaxError` for :meth:`.Script.get_syntax_errors` only
- These classes are the much biggest part of the API, because they contain
- the interesting information about all operations.
- """
- import re
- from pathlib import Path
- from typing import Optional
- from parso.tree import search_ancestor
- from jedi import settings
- from jedi import debug
- from jedi.inference.utils import unite
- from jedi.cache import memoize_method
- from jedi.inference.compiled.mixed import MixedName
- from jedi.inference.names import ImportName, SubModuleName
- from jedi.inference.gradual.stub_value import StubModuleValue
- from jedi.inference.gradual.conversion import convert_names, convert_values
- from jedi.inference.base_value import ValueSet, HasNoContext
- from jedi.api.keywords import KeywordName
- from jedi.api import completion_cache
- from jedi.api.helpers import filter_follow_imports
- def _sort_names_by_start_pos(names):
- return sorted(names, key=lambda s: s.start_pos or (0, 0))
- def defined_names(inference_state, value):
- """
- List sub-definitions (e.g., methods in class).
- :type scope: Scope
- :rtype: list of Name
- """
- try:
- context = value.as_context()
- except HasNoContext:
- return []
- filter = next(context.get_filters())
- names = [name for name in filter.values()]
- return [Name(inference_state, n) for n in _sort_names_by_start_pos(names)]
- def _values_to_definitions(values):
- return [Name(c.inference_state, c.name) for c in values]
- class BaseName:
- """
- The base class for all definitions, completions and signatures.
- """
- _mapping = {
- 'posixpath': 'os.path',
- 'riscospath': 'os.path',
- 'ntpath': 'os.path',
- 'os2emxpath': 'os.path',
- 'macpath': 'os.path',
- 'genericpath': 'os.path',
- 'posix': 'os',
- '_io': 'io',
- '_functools': 'functools',
- '_collections': 'collections',
- '_socket': 'socket',
- '_sqlite3': 'sqlite3',
- }
- _tuple_mapping = dict((tuple(k.split('.')), v) for (k, v) in {
- 'argparse._ActionsContainer': 'argparse.ArgumentParser',
- }.items())
- def __init__(self, inference_state, name):
- self._inference_state = inference_state
- self._name = name
- """
- An instance of :class:`parso.python.tree.Name` subclass.
- """
- self.is_keyword = isinstance(self._name, KeywordName)
- @memoize_method
- def _get_module_context(self):
- # This can take a while to complete, because in the worst case of
- # imports (consider `import a` completions), we need to load all
- # modules starting with a first.
- return self._name.get_root_context()
- @property
- def module_path(self) -> Optional[Path]:
- """
- Shows the file path of a module. e.g. ``/usr/lib/python3.9/os.py``
- """
- module = self._get_module_context()
- if module.is_stub() or not module.is_compiled():
- # Compiled modules should not return a module path even if they
- # have one.
- path: Optional[Path] = self._get_module_context().py__file__()
- return path
- return None
- @property
- def name(self):
- """
- Name of variable/function/class/module.
- For example, for ``x = None`` it returns ``'x'``.
- :rtype: str or None
- """
- return self._name.get_public_name()
- @property
- def type(self):
- """
- The type of the definition.
- Here is an example of the value of this attribute. Let's consider
- the following source. As what is in ``variable`` is unambiguous
- to Jedi, :meth:`jedi.Script.infer` should return a list of
- definition for ``sys``, ``f``, ``C`` and ``x``.
- >>> from jedi import Script
- >>> source = '''
- ... import keyword
- ...
- ... class C:
- ... pass
- ...
- ... class D:
- ... pass
- ...
- ... x = D()
- ...
- ... def f():
- ... pass
- ...
- ... for variable in [keyword, f, C, x]:
- ... variable'''
- >>> script = Script(source)
- >>> defs = script.infer()
- Before showing what is in ``defs``, let's sort it by :attr:`line`
- so that it is easy to relate the result to the source code.
- >>> defs = sorted(defs, key=lambda d: d.line)
- >>> print(defs) # doctest: +NORMALIZE_WHITESPACE
- [<Name full_name='keyword', description='module keyword'>,
- <Name full_name='__main__.C', description='class C'>,
- <Name full_name='__main__.D', description='instance D'>,
- <Name full_name='__main__.f', description='def f'>]
- Finally, here is what you can get from :attr:`type`:
- >>> defs = [d.type for d in defs]
- >>> defs[0]
- 'module'
- >>> defs[1]
- 'class'
- >>> defs[2]
- 'instance'
- >>> defs[3]
- 'function'
- Valid values for type are ``module``, ``class``, ``instance``, ``function``,
- ``param``, ``path``, ``keyword``, ``property`` and ``statement``.
- """
- tree_name = self._name.tree_name
- resolve = False
- if tree_name is not None:
- # TODO move this to their respective names.
- definition = tree_name.get_definition()
- if definition is not None and definition.type == 'import_from' and \
- tree_name.is_definition():
- resolve = True
- if isinstance(self._name, SubModuleName) or resolve:
- for value in self._name.infer():
- return value.api_type
- return self._name.api_type
- @property
- def module_name(self):
- """
- The module name, a bit similar to what ``__name__`` is in a random
- Python module.
- >>> from jedi import Script
- >>> source = 'import json'
- >>> script = Script(source, path='example.py')
- >>> d = script.infer()[0]
- >>> print(d.module_name) # doctest: +ELLIPSIS
- json
- """
- return self._get_module_context().py__name__()
- def in_builtin_module(self):
- """
- Returns True, if this is a builtin module.
- """
- value = self._get_module_context().get_value()
- if isinstance(value, StubModuleValue):
- return any(v.is_compiled() for v in value.non_stub_value_set)
- return value.is_compiled()
- @property
- def line(self):
- """The line where the definition occurs (starting with 1)."""
- start_pos = self._name.start_pos
- if start_pos is None:
- return None
- return start_pos[0]
- @property
- def column(self):
- """The column where the definition occurs (starting with 0)."""
- start_pos = self._name.start_pos
- if start_pos is None:
- return None
- return start_pos[1]
- def get_definition_start_position(self):
- """
- The (row, column) of the start of the definition range. Rows start with
- 1, columns start with 0.
- :rtype: Optional[Tuple[int, int]]
- """
- if self._name.tree_name is None:
- return None
- definition = self._name.tree_name.get_definition()
- if definition is None:
- return self._name.start_pos
- return definition.start_pos
- def get_definition_end_position(self):
- """
- The (row, column) of the end of the definition range. Rows start with
- 1, columns start with 0.
- :rtype: Optional[Tuple[int, int]]
- """
- if self._name.tree_name is None:
- return None
- definition = self._name.tree_name.get_definition()
- if definition is None:
- return self._name.tree_name.end_pos
- if self.type in ("function", "class"):
- last_leaf = definition.get_last_leaf()
- if last_leaf.type == "newline":
- return last_leaf.get_previous_leaf().end_pos
- return last_leaf.end_pos
- return definition.end_pos
- def docstring(self, raw=False, fast=True):
- r"""
- Return a document string for this completion object.
- Example:
- >>> from jedi import Script
- >>> source = '''\
- ... def f(a, b=1):
- ... "Document for function f."
- ... '''
- >>> script = Script(source, path='example.py')
- >>> doc = script.infer(1, len('def f'))[0].docstring()
- >>> print(doc)
- f(a, b=1)
- <BLANKLINE>
- Document for function f.
- Notice that useful extra information is added to the actual
- docstring, e.g. function signatures are prepended to their docstrings.
- If you need the actual docstring, use ``raw=True`` instead.
- >>> print(script.infer(1, len('def f'))[0].docstring(raw=True))
- Document for function f.
- :param fast: Don't follow imports that are only one level deep like
- ``import foo``, but follow ``from foo import bar``. This makes
- sense for speed reasons. Completing `import a` is slow if you use
- the ``foo.docstring(fast=False)`` on every object, because it
- parses all libraries starting with ``a``.
- """
- if isinstance(self._name, ImportName) and fast:
- return ''
- doc = self._get_docstring()
- if raw:
- return doc
- signature_text = self._get_docstring_signature()
- if signature_text and doc:
- return signature_text + '\n\n' + doc
- else:
- return signature_text + doc
- def _get_docstring(self):
- return self._name.py__doc__()
- def _get_docstring_signature(self):
- return '\n'.join(
- signature.to_string()
- for signature in self._get_signatures(for_docstring=True)
- )
- @property
- def description(self):
- """
- A description of the :class:`.Name` object, which is heavily used
- in testing. e.g. for ``isinstance`` it returns ``def isinstance``.
- Example:
- >>> from jedi import Script
- >>> source = '''
- ... def f():
- ... pass
- ...
- ... class C:
- ... pass
- ...
- ... variable = f if random.choice([0,1]) else C'''
- >>> script = Script(source) # line is maximum by default
- >>> defs = script.infer(column=3)
- >>> defs = sorted(defs, key=lambda d: d.line)
- >>> print(defs) # doctest: +NORMALIZE_WHITESPACE
- [<Name full_name='__main__.f', description='def f'>,
- <Name full_name='__main__.C', description='class C'>]
- >>> str(defs[0].description)
- 'def f'
- >>> str(defs[1].description)
- 'class C'
- """
- typ = self.type
- tree_name = self._name.tree_name
- if typ == 'param':
- return typ + ' ' + self._name.to_string()
- if typ in ('function', 'class', 'module', 'instance') or tree_name is None:
- if typ == 'function':
- # For the description we want a short and a pythonic way.
- typ = 'def'
- return typ + ' ' + self._name.get_public_name()
- definition = tree_name.get_definition(include_setitem=True) or tree_name
- # Remove the prefix, because that's not what we want for get_code
- # here.
- txt = definition.get_code(include_prefix=False)
- # Delete comments:
- txt = re.sub(r'#[^\n]+\n', ' ', txt)
- # Delete multi spaces/newlines
- txt = re.sub(r'\s+', ' ', txt).strip()
- return txt
- @property
- def full_name(self):
- """
- Dot-separated path of this object.
- It is in the form of ``<module>[.<submodule>[...]][.<object>]``.
- It is useful when you want to look up Python manual of the
- object at hand.
- Example:
- >>> from jedi import Script
- >>> source = '''
- ... import os
- ... os.path.join'''
- >>> script = Script(source, path='example.py')
- >>> print(script.infer(3, len('os.path.join'))[0].full_name)
- os.path.join
- Notice that it returns ``'os.path.join'`` instead of (for example)
- ``'posixpath.join'``. This is not correct, since the modules name would
- be ``<module 'posixpath' ...>```. However most users find the latter
- more practical.
- """
- if not self._name.is_value_name:
- return None
- names = self._name.get_qualified_names(include_module_names=True)
- if names is None:
- return None
- names = list(names)
- try:
- names[0] = self._mapping[names[0]]
- except KeyError:
- pass
- return '.'.join(names)
- def is_stub(self):
- """
- Returns True if the current name is defined in a stub file.
- """
- if not self._name.is_value_name:
- return False
- return self._name.get_root_context().is_stub()
- def is_side_effect(self):
- """
- Checks if a name is defined as ``self.foo = 3``. In case of self, this
- function would return False, for foo it would return True.
- """
- tree_name = self._name.tree_name
- if tree_name is None:
- return False
- return tree_name.is_definition() and tree_name.parent.type == 'trailer'
- @debug.increase_indent_cm('goto on name')
- def goto(self, *, follow_imports=False, follow_builtin_imports=False,
- only_stubs=False, prefer_stubs=False):
- """
- Like :meth:`.Script.goto` (also supports the same params), but does it
- for the current name. This is typically useful if you are using
- something like :meth:`.Script.get_names()`.
- :param follow_imports: The goto call will follow imports.
- :param follow_builtin_imports: If follow_imports is True will try to
- look up names in builtins (i.e. compiled or extension modules).
- :param only_stubs: Only return stubs for this goto call.
- :param prefer_stubs: Prefer stubs to Python objects for this goto call.
- :rtype: list of :class:`Name`
- """
- if not self._name.is_value_name:
- return []
- names = self._name.goto()
- if follow_imports:
- names = filter_follow_imports(names, follow_builtin_imports)
- names = convert_names(
- names,
- only_stubs=only_stubs,
- prefer_stubs=prefer_stubs,
- )
- return [self if n == self._name else Name(self._inference_state, n)
- for n in names]
- @debug.increase_indent_cm('infer on name')
- def infer(self, *, only_stubs=False, prefer_stubs=False):
- """
- Like :meth:`.Script.infer`, it can be useful to understand which type
- the current name has.
- Return the actual definitions. I strongly recommend not using it for
- your completions, because it might slow down |jedi|. If you want to
- read only a few objects (<=20), it might be useful, especially to get
- the original docstrings. The basic problem of this function is that it
- follows all results. This means with 1000 completions (e.g. numpy),
- it's just very, very slow.
- :param only_stubs: Only return stubs for this goto call.
- :param prefer_stubs: Prefer stubs to Python objects for this type
- inference call.
- :rtype: list of :class:`Name`
- """
- assert not (only_stubs and prefer_stubs)
- if not self._name.is_value_name:
- return []
- # First we need to make sure that we have stub names (if possible) that
- # we can follow. If we don't do that, we can end up with the inferred
- # results of Python objects instead of stubs.
- names = convert_names([self._name], prefer_stubs=True)
- values = convert_values(
- ValueSet.from_sets(n.infer() for n in names),
- only_stubs=only_stubs,
- prefer_stubs=prefer_stubs,
- )
- resulting_names = [c.name for c in values]
- return [self if n == self._name else Name(self._inference_state, n)
- for n in resulting_names]
- def parent(self):
- """
- Returns the parent scope of this identifier.
- :rtype: Name
- """
- if not self._name.is_value_name:
- return None
- if self.type in ('function', 'class', 'param') and self._name.tree_name is not None:
- # Since the parent_context doesn't really match what the user
- # thinks of that the parent is here, we do these cases separately.
- # The reason for this is the following:
- # - class: Nested classes parent_context is always the
- # parent_context of the most outer one.
- # - function: Functions in classes have the module as
- # parent_context.
- # - param: The parent_context of a param is not its function but
- # e.g. the outer class or module.
- cls_or_func_node = self._name.tree_name.get_definition()
- parent = search_ancestor(cls_or_func_node, 'funcdef', 'classdef', 'file_input')
- context = self._get_module_context().create_value(parent).as_context()
- else:
- context = self._name.parent_context
- if context is None:
- return None
- while context.name is None:
- # Happens for comprehension contexts
- context = context.parent_context
- return Name(self._inference_state, context.name)
- def __repr__(self):
- return "<%s %sname=%r, description=%r>" % (
- self.__class__.__name__,
- 'full_' if self.full_name else '',
- self.full_name or self.name,
- self.description,
- )
- def get_line_code(self, before=0, after=0):
- """
- Returns the line of code where this object was defined.
- :param before: Add n lines before the current line to the output.
- :param after: Add n lines after the current line to the output.
- :return str: Returns the line(s) of code or an empty string if it's a
- builtin.
- """
- if not self._name.is_value_name:
- return ''
- lines = self._name.get_root_context().code_lines
- if lines is None:
- # Probably a builtin module, just ignore in that case.
- return ''
- index = self._name.start_pos[0] - 1
- start_index = max(index - before, 0)
- return ''.join(lines[start_index:index + after + 1])
- def _get_signatures(self, for_docstring=False):
- if self._name.api_type == 'property':
- return []
- if for_docstring and self._name.api_type == 'statement' and not self.is_stub():
- # For docstrings we don't resolve signatures if they are simple
- # statements and not stubs. This is a speed optimization.
- return []
- if isinstance(self._name, MixedName):
- # While this would eventually happen anyway, it's basically just a
- # shortcut to not infer anything tree related, because it's really
- # not necessary.
- return self._name.infer_compiled_value().get_signatures()
- names = convert_names([self._name], prefer_stubs=True)
- return [sig for name in names for sig in name.infer().get_signatures()]
- def get_signatures(self):
- """
- Returns all potential signatures for a function or a class. Multiple
- signatures are typical if you use Python stubs with ``@overload``.
- :rtype: list of :class:`BaseSignature`
- """
- return [
- BaseSignature(self._inference_state, s)
- for s in self._get_signatures()
- ]
- def execute(self):
- """
- Uses type inference to "execute" this identifier and returns the
- executed objects.
- :rtype: list of :class:`Name`
- """
- return _values_to_definitions(self._name.infer().execute_with_values())
- def get_type_hint(self):
- """
- Returns type hints like ``Iterable[int]`` or ``Union[int, str]``.
- This method might be quite slow, especially for functions. The problem
- is finding executions for those functions to return something like
- ``Callable[[int, str], str]``.
- :rtype: str
- """
- return self._name.infer().get_type_hint()
- class Completion(BaseName):
- """
- ``Completion`` objects are returned from :meth:`.Script.complete`. They
- provide additional information about a completion.
- """
- def __init__(self, inference_state, name, stack, like_name_length,
- is_fuzzy, cached_name=None):
- super().__init__(inference_state, name)
- self._like_name_length = like_name_length
- self._stack = stack
- self._is_fuzzy = is_fuzzy
- self._cached_name = cached_name
- # Completion objects with the same Completion name (which means
- # duplicate items in the completion)
- self._same_name_completions = []
- def _complete(self, like_name):
- append = ''
- if settings.add_bracket_after_function \
- and self.type == 'function':
- append = '('
- name = self._name.get_public_name()
- if like_name:
- name = name[self._like_name_length:]
- return name + append
- @property
- def complete(self):
- """
- Only works with non-fuzzy completions. Returns None if fuzzy
- completions are used.
- Return the rest of the word, e.g. completing ``isinstance``::
- isinstan# <-- Cursor is here
- would return the string 'ce'. It also adds additional stuff, depending
- on your ``settings.py``.
- Assuming the following function definition::
- def foo(param=0):
- pass
- completing ``foo(par`` would give a ``Completion`` which ``complete``
- would be ``am=``.
- """
- if self._is_fuzzy:
- return None
- return self._complete(True)
- @property
- def name_with_symbols(self):
- """
- Similar to :attr:`.name`, but like :attr:`.name` returns also the
- symbols, for example assuming the following function definition::
- def foo(param=0):
- pass
- completing ``foo(`` would give a ``Completion`` which
- ``name_with_symbols`` would be "param=".
- """
- return self._complete(False)
- def docstring(self, raw=False, fast=True):
- """
- Documented under :meth:`BaseName.docstring`.
- """
- if self._like_name_length >= 3:
- # In this case we can just resolve the like name, because we
- # wouldn't load like > 100 Python modules anymore.
- fast = False
- return super().docstring(raw=raw, fast=fast)
- def _get_docstring(self):
- if self._cached_name is not None:
- return completion_cache.get_docstring(
- self._cached_name,
- self._name.get_public_name(),
- lambda: self._get_cache()
- )
- return super()._get_docstring()
- def _get_docstring_signature(self):
- if self._cached_name is not None:
- return completion_cache.get_docstring_signature(
- self._cached_name,
- self._name.get_public_name(),
- lambda: self._get_cache()
- )
- return super()._get_docstring_signature()
- def _get_cache(self):
- return (
- super().type,
- super()._get_docstring_signature(),
- super()._get_docstring(),
- )
- @property
- def type(self):
- """
- Documented under :meth:`BaseName.type`.
- """
- # Purely a speed optimization.
- if self._cached_name is not None:
- return completion_cache.get_type(
- self._cached_name,
- self._name.get_public_name(),
- lambda: self._get_cache()
- )
- return super().type
- def get_completion_prefix_length(self):
- """
- Returns the length of the prefix being completed.
- For example, completing ``isinstance``::
- isinstan# <-- Cursor is here
- would return 8, because len('isinstan') == 8.
- Assuming the following function definition::
- def foo(param=0):
- pass
- completing ``foo(par`` would return 3.
- """
- return self._like_name_length
- def __repr__(self):
- return '<%s: %s>' % (type(self).__name__, self._name.get_public_name())
- class Name(BaseName):
- """
- *Name* objects are returned from many different APIs including
- :meth:`.Script.goto` or :meth:`.Script.infer`.
- """
- def __init__(self, inference_state, definition):
- super().__init__(inference_state, definition)
- @memoize_method
- def defined_names(self):
- """
- List sub-definitions (e.g., methods in class).
- :rtype: list of :class:`Name`
- """
- defs = self._name.infer()
- return sorted(
- unite(defined_names(self._inference_state, d) for d in defs),
- key=lambda s: s._name.start_pos or (0, 0)
- )
- def is_definition(self):
- """
- Returns True, if defined as a name in a statement, function or class.
- Returns False, if it's a reference to such a definition.
- """
- if self._name.tree_name is None:
- return True
- else:
- return self._name.tree_name.is_definition()
- def __eq__(self, other):
- return self._name.start_pos == other._name.start_pos \
- and self.module_path == other.module_path \
- and self.name == other.name \
- and self._inference_state == other._inference_state
- def __ne__(self, other):
- return not self.__eq__(other)
- def __hash__(self):
- return hash((self._name.start_pos, self.module_path, self.name, self._inference_state))
- class BaseSignature(Name):
- """
- These signatures are returned by :meth:`BaseName.get_signatures`
- calls.
- """
- def __init__(self, inference_state, signature):
- super().__init__(inference_state, signature.name)
- self._signature = signature
- @property
- def params(self):
- """
- Returns definitions for all parameters that a signature defines.
- This includes stuff like ``*args`` and ``**kwargs``.
- :rtype: list of :class:`.ParamName`
- """
- return [ParamName(self._inference_state, n)
- for n in self._signature.get_param_names(resolve_stars=True)]
- def to_string(self):
- """
- Returns a text representation of the signature. This could for example
- look like ``foo(bar, baz: int, **kwargs)``.
- :rtype: str
- """
- return self._signature.to_string()
- class Signature(BaseSignature):
- """
- A full signature object is the return value of
- :meth:`.Script.get_signatures`.
- """
- def __init__(self, inference_state, signature, call_details):
- super().__init__(inference_state, signature)
- self._call_details = call_details
- self._signature = signature
- @property
- def index(self):
- """
- Returns the param index of the current cursor position.
- Returns None if the index cannot be found in the curent call.
- :rtype: int
- """
- return self._call_details.calculate_index(
- self._signature.get_param_names(resolve_stars=True)
- )
- @property
- def bracket_start(self):
- """
- Returns a line/column tuple of the bracket that is responsible for the
- last function call. The first line is 1 and the first column 0.
- :rtype: int, int
- """
- return self._call_details.bracket_leaf.start_pos
- def __repr__(self):
- return '<%s: index=%r %s>' % (
- type(self).__name__,
- self.index,
- self._signature.to_string(),
- )
- class ParamName(Name):
- def infer_default(self):
- """
- Returns default values like the ``1`` of ``def foo(x=1):``.
- :rtype: list of :class:`.Name`
- """
- return _values_to_definitions(self._name.infer_default())
- def infer_annotation(self, **kwargs):
- """
- :param execute_annotation: Default True; If False, values are not
- executed and classes are returned instead of instances.
- :rtype: list of :class:`.Name`
- """
- return _values_to_definitions(self._name.infer_annotation(ignore_stars=True, **kwargs))
- def to_string(self):
- """
- Returns a simple representation of a param, like
- ``f: Callable[..., Any]``.
- :rtype: str
- """
- return self._name.to_string()
- @property
- def kind(self):
- """
- Returns an enum instance of :mod:`inspect`'s ``Parameter`` enum.
- :rtype: :py:attr:`inspect.Parameter.kind`
- """
- return self._name.get_kind()
|