Use keyword only arguments in grammar.py

This commit is contained in:
Dave Halter
2020-07-25 02:21:51 +02:00
parent f17f94e120
commit 02eb9b9507
+27 -41
View File
@@ -40,7 +40,9 @@ class Grammar(object):
self._diff_parser = diff_parser self._diff_parser = diff_parser
self._hashed = hashlib.sha256(text.encode("utf-8")).hexdigest() self._hashed = hashlib.sha256(text.encode("utf-8")).hexdigest()
def parse(self, code=None, **kwargs): def parse(self, code=None, *, error_recovery=True, path=None,
start_symbol=None, cache=False, diff_cache=False,
cache_path=None, file_io=None):
""" """
If you want to parse a Python file you want to start here, most likely. If you want to parse a Python file you want to start here, most likely.
@@ -75,19 +77,6 @@ class Grammar(object):
:return: A subclass of :py:class:`parso.tree.NodeOrLeaf`. Typically a :return: A subclass of :py:class:`parso.tree.NodeOrLeaf`. Typically a
:py:class:`parso.python.tree.Module`. :py:class:`parso.python.tree.Module`.
""" """
if 'start_pos' in kwargs:
raise TypeError("parse() got an unexpected keyword argument.")
return self._parse(code=code, **kwargs)
def _parse(self, code=None, error_recovery=True, path=None,
start_symbol=None, cache=False, diff_cache=False,
cache_path=None, file_io=None, start_pos=(1, 0)):
"""
Wanted python3.5 * operator and keyword only arguments. Therefore just
wrap it all.
start_pos here is just a parameter internally used. Might be public
sometime in the future.
"""
if code is None and path is None and file_io is None: if code is None and path is None and file_io is None:
raise TypeError("Please provide either code or a path.") raise TypeError("Please provide either code or a path.")
@@ -139,7 +128,7 @@ class Grammar(object):
cache_path=cache_path) cache_path=cache_path)
return new_node return new_node
tokens = self._tokenizer(lines, start_pos=start_pos) tokens = self._tokenizer(lines)
p = self._parser( p = self._parser(
self._pgen_grammar, self._pgen_grammar,
@@ -224,7 +213,7 @@ class PythonGrammar(Grammar):
return tokenize(code, self.version_info) return tokenize(code, self.version_info)
def load_grammar(**kwargs): def load_grammar(*, language='python', version=None, path=None):
""" """
Loads a :py:class:`parso.Grammar`. The default version is the current Python Loads a :py:class:`parso.Grammar`. The default version is the current Python
version. version.
@@ -232,32 +221,29 @@ def load_grammar(**kwargs):
:param str version: A python version string, e.g. ``version='3.8'``. :param str version: A python version string, e.g. ``version='3.8'``.
:param str path: A path to a grammar file :param str path: A path to a grammar file
""" """
def load_grammar(language='python', version=None, path=None): if language == 'python':
if language == 'python': version_info = parse_version_string(version)
version_info = parse_version_string(version)
file = path or os.path.join( file = path or os.path.join(
'python', 'python',
'grammar%s%s.txt' % (version_info.major, version_info.minor) 'grammar%s%s.txt' % (version_info.major, version_info.minor)
) )
global _loaded_grammars global _loaded_grammars
path = os.path.join(os.path.dirname(__file__), file) path = os.path.join(os.path.dirname(__file__), file)
try:
return _loaded_grammars[path]
except KeyError:
try: try:
return _loaded_grammars[path] with open(path) as f:
except KeyError: bnf_text = f.read()
try:
with open(path) as f:
bnf_text = f.read()
grammar = PythonGrammar(version_info, bnf_text) grammar = PythonGrammar(version_info, bnf_text)
return _loaded_grammars.setdefault(path, grammar) return _loaded_grammars.setdefault(path, grammar)
except FileNotFoundError: except FileNotFoundError:
message = "Python version %s.%s is currently not supported." % ( message = "Python version %s.%s is currently not supported." % (
version_info.major, version_info.minor version_info.major, version_info.minor
) )
raise NotImplementedError(message) raise NotImplementedError(message)
else: else:
raise NotImplementedError("No support for language %s." % language) raise NotImplementedError("No support for language %s." % language)
return load_grammar(**kwargs)