3 ms·
It only makes sense to swap elements of an arrays (lists). Swapping variable is super rare. I can't recall the same time I had to swap two integers/floats or e
by xxs 5y ago
It only makes sense to swap elements of an arrays (lists).
Swapping variable is super rare. I can't recall the same time I had to swap two integers/floats or even object references.
- eesmith 5y agoYou're right! I was surprised. I did: ag '(^|[^a-zA-Z0-9=])([a-zA-Z_][a-zA-Z0-9_]*), ?([a-zA-Z_][a-zA-Z0-9_]*) ?= ?\3, ?\2' across several Python code bases I've worked on, and indeed found very few examples. Here's one from Python's statistics.py: X, Y = self, other if (Y._sigma, Y._mu) < (X._sigma, X._mu): # sort to assure commutativity X, Y = Y, X NumPy has only one match that isn't in test code, in numpy/core/numeric.py:convolve if (len(v) > len(a)): a, v = v, a It's a bit more common in SciPy, like scipy/linalg/blas.py:_get_funcs which has: if prefer_fortran: module1, module2 = module2, module1 but even then, there are only 26 relevant matches across 421KLoC.
- dotancohen 5y ago> ag '(^|[^a-zA-Z0-9=])([a-zA-Z_][a-zA-Z0-9_]*), ?([a-zA-Z_][a-zA-Z0-9_]*) ?= ?\3, ?\2' Why are you checking `(^|[^a-zA-Z0-9=])` before the first variable? Why are you storing it? Wouldn't `^\s*` (beginning of line, then 0 or more whitespace, not stored) be simpler? I ask to learn, not critically.
- eesmith 5y agoThe exclusion test is to reduce false positives like: return open(filename, mode, encoding=encoding, errors=errors) ^^^^^^^^^^^^^^^^^^^^^^^ This case matches because of the under-caret'ed e, encoding=encoding, e You are right that requiring only leading whitespace would be clearer. I didn't think of it. I only wanted to eliminate those false positives I was seeing with my original test, which only had \2, \1. In thinking more about it, your whitespace-only gives a false negative for constructs like: progressbar/widgets.py:306: if not self.fill_left: rpad, lpad = lpad, rpad matplotlib/lib/matplotlib/widgets.py:1093: if vmin>vmax: vmin, vmax = vmax, vmin The reason I stored \1 was simply to get the grouping. I didn't recall the syntax for non-capturing groups, and it wasn't worthwhile to look up.
- dotancohen 5y agoI see, thank you. Targeting the if statements, but not the open() methods, is an interesting corner case that I would not have though about.
- eesmith 5y agoI did mine because I thought some people might write it: (a, b) = (b, a) so the grouping stands out better. Turns out I didn't find any examples of that.
- jasonhansel 5y agoIt's a bit more common in C when swapping pointers, since it can help you ensure that there's only one pointer to a given structure at any time, and it can simplify memory management in certain cases by letting you repurpose an existing allocation.