PyCQA / pydocstyle

docstring style checker
http://pydocstyle.org
MIT License
1.11k stars 189 forks source link

Crash: TypeError: a bytes-like object is required, not 'str' #569

Open tushar-deepsource opened 2 years ago

tushar-deepsource commented 2 years ago

Code snippet:

def f():
    b"""abc"""

Output:

$ pydocstyle mytest.py 
Traceback (most recent call last):
  File "/Users/tusharsadhwani/code/marvin-python/venv3/bin/pydocstyle", line 8, in <module>
    sys.exit(main())
  File "/Users/tusharsadhwani/code/marvin-python/venv3/lib/python3.10/site-packages/pydocstyle/cli.py", line 68, in main
    sys.exit(run_pydocstyle())
  File "/Users/tusharsadhwani/code/marvin-python/venv3/lib/python3.10/site-packages/pydocstyle/cli.py", line 44, in run_pydocstyle
    errors.extend(check((filename,), select=checked_codes,
  File "/Users/tusharsadhwani/code/marvin-python/venv3/lib/python3.10/site-packages/pydocstyle/checker.py", line 993, in check
    for error in ConventionChecker().check_source(source, filename,
  File "/Users/tusharsadhwani/code/marvin-python/venv3/lib/python3.10/site-packages/pydocstyle/checker.py", line 143, in check_source
    error = this_check(self, definition,
  File "/Users/tusharsadhwani/code/marvin-python/venv3/lib/python3.10/site-packages/pydocstyle/checker.py", line 204, in check_one_liners
    lines = safe_literal_eval(docstring).split('\n')
TypeError: a bytes-like object is required, not 'str'
cclauss commented 1 year ago

What use case necessitates creating a docstring that is bytes?

I can see a reason for creating a docstring that is a r"raw string" but not a reason for creating a docstring that is a b"bytes".

tusharsadhwani commented 1 year ago

@cclauss there's no specific reason per se, but if I were to do that, I'd hope that pydocstyle won't crash while running on my code.

cclauss commented 1 year ago

My sense is that it is a good thing that bad input results in an exception being raised.

sambhav commented 1 year ago

+1 I agree with @cclauss. If it helps improve things, we might even want to catch that type error and add a helpful error message that points to the above link. Although I'm ambivalent on the latter.

tusharsadhwani commented 1 year ago

Having the program crash with a stack trace is bad for two reasons:

cclauss commented 1 year ago

Their code is buggy. Python 2: bytes == str Python 3: bytes != str The PEP is clear that docstrings should be a string literal.

tushar-deepsource commented 1 year ago

What I meant here was: When pydocstyle crashes, the user doesn't know if it's a bug in their code, or is it a bug in pydocstyle's code.

Certainly, when I run a python program and it crashes I assume there's a bug in the program, and not the input I gave.