
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