NamedTporaryFile nasıl açıklanmalıdır?
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
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.