python / python/typeshed

`tarfile.TarFile` has several missing overloads

Open
#14,168 2 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

help wanted stubs: false negative
Dominant language
Python
Stars
5.1k
Forks
2.1k
Avg merge
1d 19h
Merged PRs (30d)
82

Description

Right now TarFile.__init__ is defined as: https://github.com/python/typeshed/blob/c7e29eccd9759411c0f46580e20727038668b320/stdlib/tarfile.pyi#L128-L132

Which is not exactly right, because there's a case when name and fileobj are both None at the same time. And this will lead to runtime errors:

>>> import tarfile
>>> tarfile.TarFile(None, fileobj=None)
Traceback (most recent call last):
  File "<python-input-2>", line 1, in <module>
    tarfile.TarFile(None, fileobj=None)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/Users/sobolev/Desktop/cpython/Lib/tarfile.py", line 1729, in __init__
    fileobj = bltn_open(name, self._mode)
TypeError: expected str, bytes or os.PathLike object, not NoneType

Right now mypy does not raise any errors for this broken case: https://mypy-play.net/?mypy=latest&python=3.12&gist=7452d274249fafba1f8a16565d5486c6

We need either name or fileobj, they can be both None at the same time. So, we need to add overloads.

There are several other methods that needs to be updated like open and taropen, maybe others.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with stdlib/tarfile.pyi around lines 128-132 and review the signatures for TarFile.init, open, and taropen. Reproduce the None/None call with mypy using the linked playground example, then check that the overloads represent the valid name/fileobj combinations and diagnose the invalid case.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
devtools
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.