Repository navigation
bpo-32940: IDLE: Simplify StringTranslatePseudoMapping in pyparse #5862
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 5 commits
0d46d85
9472ee9
6e41844
47cd451
437ed57
ef77d35
272f732
909989c
7ad8392
968c4a8
d4e350a
74a9796
405c5f7
867e897
5c7ba8b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,6 @@ | ||
| """Define partial Python code Parser used by editor and hyperparser. | ||
|
|
||
| Instances of StringTranslatePseudoMapping are used with str.translate. | ||
| Instances of ParseMap are used with str.translate. | ||
|
|
||
| The following bound search and match functions are defined: | ||
| _synchre - start of popular statement; | ||
|
|
@@ -101,46 +101,19 @@ | |
| """, re.VERBOSE).match | ||
|
|
||
|
|
||
| class StringTranslatePseudoMapping(Mapping): | ||
| r"""Utility class to be used with str.translate() | ||
| class ParseMap(dict): | ||
| r"""Dict subclass that maps anything not in dict to 'x'. | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thought of this while I was sleeping. Should be
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No. PEP434 declares nearly all of idlelib 'private', and it became such in practice nearly 3 years later, for in 3.6. There is no point to further privatization.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks. |
||
|
|
||
| This Mapping class wraps a given dict. When a value for a key is | ||
| requested via __getitem__() or get(), the key is looked up in the | ||
| given dict. If found there, the value from the dict is returned. | ||
| Otherwise, the default value given upon initialization is returned. | ||
| This is designed to be used with str.translate in study1. | ||
| Anything not specifically mapped otherwise becomes 'x'. | ||
| Example: replace everything except whitespace with 'x'. | ||
|
|
||
| This allows using str.translate() to make some replacements, and to | ||
| replace all characters for which no replacement was specified with | ||
| a given character instead of leaving them as-is. | ||
|
|
||
| For example, to replace everything except whitespace with 'x': | ||
|
|
||
| >>> whitespace_chars = ' \t\n\r' | ||
| >>> preserve_dict = {ord(c): ord(c) for c in whitespace_chars} | ||
| >>> mapping = StringTranslatePseudoMapping(preserve_dict, ord('x')) | ||
| >>> text = "a + b\tc\nd" | ||
| >>> text.translate(mapping) | ||
| >>> keepwhite = ParseMap((ord(c),ord(c)) for c in ' \t\n\r') | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add a space after comma. And the second
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. space added |
||
| >>> "a + b\tc\nd".translate(keepwhite) | ||
| 'x x x\tx\nx' | ||
| """ | ||
| def __init__(self, non_defaults, default_value): | ||
| self._non_defaults = non_defaults | ||
| self._default_value = default_value | ||
|
|
||
| def _get(key, _get=non_defaults.get, _default=default_value): | ||
| return _get(key, _default) | ||
| self._get = _get | ||
|
|
||
| def __getitem__(self, item): | ||
| return self._get(item) | ||
|
|
||
| def __len__(self): | ||
| return len(self._non_defaults) | ||
|
|
||
| def __iter__(self): | ||
| return iter(self._non_defaults) | ||
|
|
||
| def get(self, key, default=None): | ||
| return self._get(key) | ||
| def __getitem__(self, key): | ||
| return self.get(key, 'x') | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I had done a version yesterday that inherited from It didn't have
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When it works. We are not going to do anything so nonsensical.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. :-)
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Defining |
||
|
|
||
|
|
||
| class Parser: | ||
|
|
@@ -224,15 +197,13 @@ def set_lo(self, lo): | |
| if lo > 0: | ||
| self.code = self.code[lo:] | ||
|
|
||
| # Build a translation table to map uninteresting chars to 'x', open | ||
| # brackets to '(', close brackets to ')' while preserving quotes, | ||
| # backslashes, newlines and hashes. This is to be passed to | ||
| # str.translate() in _study1(). | ||
| _tran = {} | ||
| _tran.update((ord(c), ord('(')) for c in "({[") | ||
| _tran.update((ord(c), ord(')')) for c in ")}]") | ||
| _tran.update((ord(c), ord(c)) for c in "\"'\\\n#") | ||
| _tran = StringTranslatePseudoMapping(_tran, default_value=ord('x')) | ||
| # Map1 maps uninteresting chars to 'x', open brackets to '(', | ||
| # close brackets to ')', and preserves quotes, backslashes, | ||
| # newlines and hashes. Used for str.translate() in _study1(). | ||
| map1 = ParseMap() | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What is the reason of renaming
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The tests pass with map1 reads better to me. The object is a map for _study1. 'tran' is a prefix for numerous words, often verbs, not a word in itself.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is a matter of style, but to me, |
||
| map1.update((ord(c), ord('(')) for c in "({[") | ||
| map1.update((ord(c), ord(')')) for c in ")}]") | ||
| map1.update((ord(c), ord(c)) for c in "\"'\\\n#") | ||
|
|
||
| def _study1(self): | ||
| """Find the line numbers of non-continuation lines. | ||
|
|
@@ -250,7 +221,7 @@ def _study1(self): | |
| # uninteresting characters. This can cut the number of chars | ||
| # by a factor of 10-40, and so greatly speed the following loop. | ||
| code = self.code | ||
| code = code.translate(self._tran) | ||
| code = code.translate(self.map1) | ||
| code = code.replace('xxxxxxxx', 'x') | ||
| code = code.replace('xxxx', 'x') | ||
| code = code.replace('xx', 'x') | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| Simplify and rename StringTranslatePseudoMapping in pyparse. |
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isn't this class equivalent to
defaultdict(lambda:"x")There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This class doesn't add the keys to the dictionary when they haven't been found. It will return the default value without growing the dictionary.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, defaultdict calls the function to get 'x', instead of just returning it.