Show More
@@ -266,6 +266,7 b' python-profiler package from non-free.""")' | |||
|
266 | 266 | # Get options |
|
267 | 267 | list_all = kw.get('list_all',0) |
|
268 | 268 | posix = kw.get('posix', os.name == 'posix') |
|
269 | strict = kw.get('strict', True) | |
|
269 | 270 | |
|
270 | 271 | # Check if we have more than one argument to warrant extra processing: |
|
271 | 272 | odict = {} # Dictionary with options |
@@ -273,7 +274,7 b' python-profiler package from non-free.""")' | |||
|
273 | 274 | if len(args) >= 1: |
|
274 | 275 | # If the list of inputs only has 0 or 1 thing in it, there's no |
|
275 | 276 | # need to look for options |
|
276 | argv = arg_split(arg_str,posix) | |
|
277 | argv = arg_split(arg_str, posix, strict) | |
|
277 | 278 | # Do regular option processing |
|
278 | 279 | try: |
|
279 | 280 | opts,args = getopt(argv,opt_str,*long_opts) |
@@ -1865,7 +1866,7 b' Currently the magic system has the following functions:\\n"""' | |||
|
1865 | 1866 | scaling = [1, 1e3, 1e6, 1e9] |
|
1866 | 1867 | |
|
1867 | 1868 | opts, stmt = self.parse_options(parameter_s,'n:r:tcp:', |
|
1868 | posix=False) | |
|
1869 | posix=False, strict=False) | |
|
1869 | 1870 | if stmt == "": |
|
1870 | 1871 | return |
|
1871 | 1872 | timefunc = timeit.default_timer |
@@ -344,3 +344,12 b' def test_psearch():' | |||
|
344 | 344 | with tt.AssertPrints("dict.fromkeys"): |
|
345 | 345 | _ip.run_cell("dict.fr*?") |
|
346 | 346 | |
|
347 | def test_timeit_shlex(): | |
|
348 | """test shlex issues with timeit (#1109)""" | |
|
349 | _ip.ex("def f(*a,**kw): pass") | |
|
350 | _ip.magic('timeit -n1 "this is a bug".count(" ")') | |
|
351 | _ip.magic('timeit -r1 -n1 f(" ", 1)') | |
|
352 | _ip.magic('timeit -r1 -n1 f(" ", 1, " ", 2, " ")') | |
|
353 | _ip.magic('timeit -r1 -n1 ("a " + "b")') | |
|
354 | _ip.magic('timeit -r1 -n1 f("a " + "b")') | |
|
355 | _ip.magic('timeit -r1 -n1 f("a " + "b ")') |
@@ -146,12 +146,18 b' def getoutputerror(cmd):' | |||
|
146 | 146 | return py3compat.bytes_to_str(out), py3compat.bytes_to_str(err) |
|
147 | 147 | |
|
148 | 148 | |
|
149 | def arg_split(s, posix=False): | |
|
149 | def arg_split(s, posix=False, strict=True): | |
|
150 | 150 | """Split a command line's arguments in a shell-like manner. |
|
151 | 151 | |
|
152 | 152 | This is a modified version of the standard library's shlex.split() |
|
153 | 153 | function, but with a default of posix=False for splitting, so that quotes |
|
154 |
in inputs are respected. |
|
|
154 | in inputs are respected. | |
|
155 | ||
|
156 | if strict=False, then any errors shlex.split would raise will result in the | |
|
157 | unparsed remainder being the last element of the list, rather than raising. | |
|
158 | This is because we sometimes use arg_split to parse things other than | |
|
159 | command-line args. | |
|
160 | """ | |
|
155 | 161 | |
|
156 | 162 | # Unfortunately, python's shlex module is buggy with unicode input: |
|
157 | 163 | # http://bugs.python.org/issue1170 |
@@ -163,7 +169,25 b' def arg_split(s, posix=False):' | |||
|
163 | 169 | s = s.encode('utf-8') |
|
164 | 170 | lex = shlex.shlex(s, posix=posix) |
|
165 | 171 | lex.whitespace_split = True |
|
166 | tokens = list(lex) | |
|
172 | # Extract tokens, ensuring that things like leaving open quotes | |
|
173 | # does not cause this to raise. This is important, because we | |
|
174 | # sometimes pass Python source through this (e.g. %timeit f(" ")), | |
|
175 | # and it shouldn't raise an exception. | |
|
176 | # It may be a bad idea to parse things that are not command-line args | |
|
177 | # through this function, but we do, so let's be safe about it. | |
|
178 | tokens = [] | |
|
179 | while True: | |
|
180 | try: | |
|
181 | tokens.append(lex.next()) | |
|
182 | except StopIteration: | |
|
183 | break | |
|
184 | except ValueError: | |
|
185 | if strict: | |
|
186 | raise | |
|
187 | # couldn't parse, get remaining blob as last token | |
|
188 | tokens.append(lex.token) | |
|
189 | break | |
|
190 | ||
|
167 | 191 | if is_unicode: |
|
168 | 192 | # Convert the tokens back to unicode. |
|
169 | 193 | tokens = [x.decode('utf-8') for x in tokens] |
General Comments 0
You need to be logged in to leave comments.
Login now