Possible Refactoring
The quopri module conditionally imports binascii and uses custom code if binascii can't be found. For example, the encode() function currently has 60 lines (including empty lines and the docstring), of which only 47 lines are dedicated to the workaround:
| defencode(input, output, quotetabs, header=False): |
| """Read 'input', apply quoted-printable encoding, and write to 'output'. |
| |
| 'input' and 'output' are binary file objects. The 'quotetabs' flag |
| indicates whether embedded tabs and spaces should be quoted. Note that |
| line-ending tabs and spaces are always encoded, as per RFC 1521. |
| The 'header' flag indicates whether we are encoding spaces as _ as per RFC |
| 1522.""" |
| |
| ifb2a_qpisnotNone: |
| data=input.read() |
| odata=b2a_qp(data, quotetabs=quotetabs, header=header) |
| output.write(odata) |
| return |
| |
| defwrite(s, output=output, lineEnd=b'\n'): |
| # RFC 1521 requires that the line ending in a space or tab must have |
| # that trailing character encoded. |
| ifsands[-1:] inb' \t': |
| output.write(s[:-1] +quote(s[-1:]) +lineEnd) |
| elifs==b'.': |
| output.write(quote(s) +lineEnd) |
| else: |
| output.write(s+lineEnd) |
| |
| prevline=None |
| while1: |
| line=input.readline() |
| ifnotline: |
| break |
| outline= [] |
| # Strip off any readline induced trailing newline |
| stripped=b'' |
| ifline[-1:] ==b'\n': |
| line=line[:-1] |
| stripped=b'\n' |
| # Calculate the un-length-limited encoded line |
| forcinline: |
| c=bytes((c,)) |
| ifneedsquoting(c, quotetabs, header): |
| c=quote(c) |
| ifheaderandc==b' ': |
| outline.append(b'_') |
| else: |
| outline.append(c) |
| # First, write out the previous line |
| ifprevlineisnotNone: |
| write(prevline) |
| # Now see if we need any soft line breaks because of RFC-imposed |
| # length limitations. Then do the thisline->prevline dance. |
| thisline=EMPTYSTRING.join(outline) |
| whilelen(thisline) >MAXLINESIZE: |
| # Don't forget to include the soft line break `=' sign in the |
| # length calculation! |
| write(thisline[:MAXLINESIZE-1], lineEnd=b'=\n') |
| thisline=thisline[MAXLINESIZE-1:] |
| # Write out the current line |
| prevline=thisline |
| # Write out the last line, without a trailing newline |
| ifprevlineisnotNone: |
| write(prevline, lineEnd=stripped) |
This is essentially dead code, since I don't think there are any (sane) scenarios nowadays, where binascii is not available. I recommend to remove the conditional import and dead code. I'm willing to write a PR.
Your environment
- CPython versions tested on: Seen on cpython HEAD as of 2022-11-03
Possible Refactoring
The
quoprimodule conditionally importsbinasciiand uses custom code ifbinasciican't be found. For example, theencode()function currently has 60 lines (including empty lines and the docstring), of which only 47 lines are dedicated to the workaround:cpython/Lib/quopri.py
Lines 44 to 104 in e9ac890
This is essentially dead code, since I don't think there are any (sane) scenarios nowadays, where
binasciiis not available. I recommend to remove the conditional import and dead code. I'm willing to write a PR.Your environment