[3.8] bpo-35168: Make shlex.punctuation_chars read-only (GH-11631) (GH-15927)

(cherry picked from commit 972cf5c06a)

Co-authored-by: Alex <a.v.shkop@gmail.com>
This commit is contained in:
Vinay Sajip 2019-09-11 13:39:52 +01:00 committed by GitHub
parent 01ae0e2698
commit 3b92ddb761
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 18 additions and 4 deletions

View file

@ -113,7 +113,9 @@ The :mod:`shlex` module defines the following class:
characters, those characters will be used as the punctuation characters. Any characters, those characters will be used as the punctuation characters. Any
characters in the :attr:`wordchars` attribute that appear in characters in the :attr:`wordchars` attribute that appear in
*punctuation_chars* will be removed from :attr:`wordchars`. See *punctuation_chars* will be removed from :attr:`wordchars`. See
:ref:`improved-shell-compatibility` for more information. :ref:`improved-shell-compatibility` for more information. *punctuation_chars*
can be set only upon :class:`~shlex.shlex` instance creation and can't be
modified later.
.. versionchanged:: 3.6 .. versionchanged:: 3.6
The *punctuation_chars* parameter was added. The *punctuation_chars* parameter was added.
@ -317,8 +319,8 @@ variables which either control lexical analysis or can be used for debugging:
.. attribute:: shlex.punctuation_chars .. attribute:: shlex.punctuation_chars
Characters that will be considered punctuation. Runs of punctuation A read-only property. Characters that will be considered punctuation. Runs of
characters will be returned as a single token. However, note that no punctuation characters will be returned as a single token. However, note that no
semantic validity checking will be performed: for example, '>>>' could be semantic validity checking will be performed: for example, '>>>' could be
returned as a token, even though it may not be recognised as such by shells. returned as a token, even though it may not be recognised as such by shells.

View file

@ -55,7 +55,7 @@ class shlex:
punctuation_chars = '' punctuation_chars = ''
elif punctuation_chars is True: elif punctuation_chars is True:
punctuation_chars = '();<>|&' punctuation_chars = '();<>|&'
self.punctuation_chars = punctuation_chars self._punctuation_chars = punctuation_chars
if punctuation_chars: if punctuation_chars:
# _pushback_chars is a push back queue used by lookahead logic # _pushback_chars is a push back queue used by lookahead logic
self._pushback_chars = deque() self._pushback_chars = deque()
@ -65,6 +65,10 @@ class shlex:
t = self.wordchars.maketrans(dict.fromkeys(punctuation_chars)) t = self.wordchars.maketrans(dict.fromkeys(punctuation_chars))
self.wordchars = self.wordchars.translate(t) self.wordchars = self.wordchars.translate(t)
@property
def punctuation_chars(self):
return self._punctuation_chars
def push_token(self, tok): def push_token(self, tok):
"Push a token onto the stack popped by the get_token method" "Push a token onto the stack popped by the get_token method"
if self.debug >= 1: if self.debug >= 1:

View file

@ -353,6 +353,13 @@ class ShlexTest(unittest.TestCase):
resplit = shlex.split(joined) resplit = shlex.split(joined)
self.assertEqual(split_command, resplit) self.assertEqual(split_command, resplit)
def testPunctuationCharsReadOnly(self):
punctuation_chars = "/|$%^"
shlex_instance = shlex.shlex(punctuation_chars=punctuation_chars)
self.assertEqual(shlex_instance.punctuation_chars, punctuation_chars)
with self.assertRaises(AttributeError):
shlex_instance.punctuation_chars = False
# Allow this test to be used with old shlex.py # Allow this test to be used with old shlex.py
if not getattr(shlex, "split", None): if not getattr(shlex, "split", None):

View file

@ -0,0 +1 @@
:attr:`shlex.shlex.punctuation_chars` is now a read-only property.