| Index: Lib/fnmatch.py |
| =================================================================== |
| --- Lib/fnmatch.py (revision 66736) |
| +++ Lib/fnmatch.py (working copy) |
| @@ -37,15 +37,24 @@ |
| pat = os.path.normcase(pat) |
| return fnmatchcase(name, pat) |
| +def _compile_pattern(pat): |
| + regex = _cache.get(pat) |
| + if regex is None: |
| + if isinstance(pat, bytes): |
| + pat_str = str(pat, 'ISO-8859-1') |
| + res_str = translate(pat_str) |
| + res = bytes(res_str, 'ISO-8859-1') |
| + else: |
| + res = translate(pat) |
| + _cache[pat] = regex = re.compile(res) |
| + return regex.match |
| + |
| def filter(names, pat): |
| """Return the subset of the list NAMES that match PAT""" |
| import os,posixpath |
| - result=[] |
| - pat=os.path.normcase(pat) |
| - if not pat in _cache: |
| - res = translate(pat) |
| - _cache[pat] = re.compile(res) |
| - match=_cache[pat].match |
| + result = [] |
| + pat = os.path.normcase(pat) |
| + match = _compile_pattern(pat) |
| if os.path is posixpath: |
| # normcase on posix is NOP. Optimize it away from the loop. |
| for name in names: |
| @@ -64,10 +73,8 @@ |
| its arguments. |
| """ |
| - if not pat in _cache: |
| - res = translate(pat) |
| - _cache[pat] = re.compile(res) |
| - return _cache[pat].match(name) is not None |
| + match = _compile_pattern(pat) |
| + return match(name) is not None |
| def translate(pat): |
| """Translate a shell PATTERN to a regular expression. |