annotate Tools/scripts/rgrep.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 5ae390ac6c61
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
59522
fcfe324663a6 convert shebang lines: python -> python3
Benjamin Peterson <benjamin@python.org>
parents: 42427
diff changeset
1 #! /usr/bin/env python3
8981
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 """Reverse grep.
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 Usage: rgrep [-i] pattern file
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 """
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
7
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 import sys
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 import re
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 import getopt
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
11
63872
5ae390ac6c61 Clean up syntax for some scripts.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59522
diff changeset
12
8981
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 def main():
63872
5ae390ac6c61 Clean up syntax for some scripts.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59522
diff changeset
14 bufsize = 64 * 1024
8981
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 reflags = 0
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 opts, args = getopt.getopt(sys.argv[1:], "i")
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 for o, a in opts:
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 if o == '-i':
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 reflags = reflags | re.IGNORECASE
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 if len(args) < 2:
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 usage("not enough arguments")
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 if len(args) > 2:
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 usage("exactly one file argument required")
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 pattern, filename = args
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 try:
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 prog = re.compile(pattern, reflags)
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 25219
diff changeset
27 except re.error as msg:
63872
5ae390ac6c61 Clean up syntax for some scripts.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59522
diff changeset
28 usage("error in regular expression: %s" % msg)
8981
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 try:
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 f = open(filename)
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 25219
diff changeset
31 except IOError as msg:
63872
5ae390ac6c61 Clean up syntax for some scripts.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59522
diff changeset
32 usage("can't open %r: %s" % (filename, msg), 1)
8981
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 f.seek(0, 2)
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 pos = f.tell()
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 leftover = None
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 while pos > 0:
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 size = min(pos, bufsize)
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 pos = pos - size
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 f.seek(pos)
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 buffer = f.read(size)
25219
8a7a2f1f88f0 Apply diff2.txt from SF patch http://www.python.org/sf/572113
Walter Dörwald <walter@livinglogic.de>
parents: 8981
diff changeset
41 lines = buffer.split("\n")
8981
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 del buffer
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 if leftover is None:
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 if not lines[-1]:
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 del lines[-1]
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 else:
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 lines[-1] = lines[-1] + leftover
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 if pos > 0:
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 leftover = lines[0]
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 del lines[0]
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 else:
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 leftover = None
63872
5ae390ac6c61 Clean up syntax for some scripts.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59522
diff changeset
53 for line in reversed(lines):
8981
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 if prog.search(line):
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 40587
diff changeset
55 print(line)
8981
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
56
63872
5ae390ac6c61 Clean up syntax for some scripts.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59522
diff changeset
57
8981
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 def usage(msg, code=2):
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 sys.stdout = sys.stderr
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 40587
diff changeset
60 print(msg)
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 40587
diff changeset
61 print(__doc__)
8981
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 sys.exit(code)
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
63872
5ae390ac6c61 Clean up syntax for some scripts.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59522
diff changeset
64
8981
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 if __name__ == '__main__':
0398051f8ffa New tool: reverse grep (greps from the end). Uses a fairly efficient
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 main()