NamedTporaryFile nasıl açıklanmalıdır?

Oct 19 2020

Bir dosya veya dosya benzeri nesne için Tür ipucundatyping.IO önerildiği gibi denedim mi? ama çalışmıyor:

from __future__ import annotations
from tempfile import NamedTemporaryFile
from typing import IO

def example(tmp: IO) -> str:
    print(tmp.file)
    return tmp.name


print(example(NamedTemporaryFile()))

bunun için mypy bana şunu söylüyor:

test.py:6: error: "IO[Any]" has no attribute "file"; maybe "fileno"?

ve Python iyi çalışıyor. Yani kod tamam.

Yanıtlar

4 Carcigenicate Oct 19 2020 at 21:15

Bunun kolayca ima edilebileceğini sanmıyorum.

Tanımını kontrol ederseniz NamedTemporaryFile, bunun biten bir işlev olduğunu görürsünüz:

return _TemporaryFileWrapper(file, name, delete)

Ve _TemporaryFileWrapperşu şekilde tanımlanır:

class _TemporaryFileWrapper:

Bu, gösterilebilecek bir süper sınıf olmadığı ve _TemporaryFileWrapper"modüle özel" olduğu anlamına gelir. Ayrıca, onu var olanın bir parçası yapan herhangi bir üyeye sahip gibi görünmüyor Protocol( Iterableve hariç ContextManager; ama burada bu yöntemleri kullanmıyorsunuz).

_TemporaryFileWrapperUyarıları kullanmanız ve görmezden gelmeniz gerektiğini düşünüyorum :

from tempfile import _TemporaryFileWrapper  # Weak error

def example(tmp: _TemporaryFileWrapper) -> str:
    print(tmp.file)
    return tmp.name

Gerçekten temiz bir çözüm istiyorsanız, olabilir kendi uygulamak Protocol İhtiyacınız niteliklerini içeren ve aynı zamanda devralan gelmiş Iterableve ContextManager. Daha sonra özel ifadenizi kullanarak ipucu yazabilirsiniz Protocol.