[Python-ideas] "try with" syntactic sugar
Bruce Frederiksen
dangyogi at gmail.com
Fri Feb 27 02:28:29 CET 2009
Daniel Stutzbach wrote:
> Hi Bruce,
>
> I bow to your superior regular expression knowledge. :) However,
> your version counts the number of "try"s that are followed by "with".
> Mine counts the number of "with"s that are preceded by "try" (which I
> think the more relevant metric?). Any chance you could alter your script?
Sorry, my mistake.
How about this?
#!/usr/bin/python
import re, sys
re_with = re.compile(r'''
^(?P<indent>\s*) # capture the indent
# (might be try, might be with)
(?P<try>
try:
(?:[ \t]*(?:\#.*)?[\r\n]+)? # newlines (ignoring comments)
(?P=indent)[ \t]+ # kick out the indent level
)?
with\s (?:[^#:]*(?:(?:\#.*)?[\r\n]+)?)*: # with .*: (ignoring comments
# and newlines before :)
''', re.MULTILINE | re.VERBOSE)
try_with = 0
total = 0
for fname in sys.argv[1:]:
data = open(fname).read()
for match in re_with.finditer(data):
if match.group('try'): try_with += 1
total += 1
print 'try-with:', try_with, 'out of:', total, '(',
try_with*100.0/total,'%)'
On my code, I now get:
try-with: 1 out of: 47 ( 2.12765957447 %)
On my last response, I mentioned a suggestion to add __throw__ to
context managers. But then I remembered that the __exit__ method is
already given the exception information if an exception is raised. So
you can already do what I was suggesting now.
I'm still curious as to how often you could share try/except cases by
writing your own context managers.
-bruce frederiksen
More information about the Python-ideas
mailing list