4 This isn't really an example of pyutils but rather a development
5 tool I used as part of a git pre-commit hook...
7 f)ind f)ucked f)-strings
9 Searches python files for suspicious looking strings that seem to
10 use f-string {interpolations} without acutally being f-strings.
18 from pathlib import Path
19 from token import STRING
20 from typing import List, Tuple
22 from pyutils import ansi
24 curly = re.compile(r'\{[^\}]+\}')
27 def looks_suspicious(q: str, previous_tokens: List[Tuple[int, str]]) -> bool:
28 for pair in previous_tokens:
31 return q[0] != 'f' and curly.search(q) is not None
34 for filename in sys.argv[1:]:
36 if path.suffix != ".py":
37 print(f"{filename} doesn't look like python; skipping.", file=sys.stderr)
39 with tokenize.open(filename) as f:
41 for token in tokenize.generate_tokens(f.readline):
42 (ttype, text, (start_row, _), (end_row, _), _) = token
47 and looks_suspicious(text, previous_tokens)
50 f"{ansi.fg('green')}{filename}:{start_row}-{end_row}>{ansi.reset()}"
52 for (n, line) in enumerate(text.split('\n')):
54 f'{ansi.fg("dark gray")}{start_row+n}:{ansi.reset()} {line}'
56 # print('Previous context:')
57 # for pair in previous_tokens:
58 # print(f'{pair[0]} ({pair[1]})', end=' + ')
60 previous_tokens.append((ttype, text))
61 previous_tokens = previous_tokens[-3:]