3
\$\begingroup\$

I have a small function that when passed a str that names a file that contains a program; it returns a 2-tuple with the number of the non-empty lines in that program, and the sum of the lengths of all those lines. Here is my current functioning code:

def code_metric(file_name):
    line_count = char_count = 0
    with open(file_name) as fin:
        stripped = (line.rstrip() for line in fin)
        for line_count, line in enumerate(filter(None, stripped), 1):
            char_count += len(line)
    return line_count, char_count

Is there a way to implement this function using functionals such as map, filter, and reduce and small lambdas to pass to these functionals? I could make it work conventionally but having some issue with using functionals. Any help would be great.

\$\endgroup\$
2
\$\begingroup\$
  • line_count can be obtained with len(lines) instead of an enumerate.
  • You use rstrip (rightstrip), I think that strip is better as you (probably) don't want to count the blanks of indentation as characters.
  • f is the standard name for files in Python not fin
  • Using list comprehension and a for loop as you do is much more readable than a functional alternative, anyway, down here I show you a functional version:

:

def code_metric(file_name):
    with open(file_name) as f:
        lines = f.read().splitlines()
    char_count = sum(map(len,(map(str.strip,filter(None,lines)))))
    return len(filter(None,lines)), char_count
\$\endgroup\$
  • \$\begingroup\$ @Caridorc- I tried using the function you gave but it keeps giving me the following error: char_count = sum(map(len, (map(str.strip(), filter(None, lines))))) TypeError: descriptor 'strip' of 'str' object needs an argument \$\endgroup\$ – LucyBen Feb 8 '15 at 19:42
  • \$\begingroup\$ @LucyBen excuse me, it is fixed now. \$\endgroup\$ – Caridorc Feb 8 '15 at 19:44
  • \$\begingroup\$ @Caridorc- Thank you. I've updated the question with your code. The output doesn't match when I ran as the figures are off. I've provided an example of the run as well. Hope that helps. \$\endgroup\$ – LucyBen Feb 8 '15 at 20:00
  • \$\begingroup\$ @Caridorc, you're counting un-filtered lines - essentially counting those that are empty too \$\endgroup\$ – volcano Feb 12 '15 at 23:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.