Saya memiliki metode yang memeriksa dan memproses sumber kelas arbitrer (hanya kelas, bukan instance kelas atau tipe non-kelas lainnya). Kelas dapat dari pustaka standar apa pun, atau pustaka pihak ketiga, atau kelas yang ditentukan pengguna.

Tetapi tidak tahu cara yang benar untuk membuat anotasi tipe argumen kelas menggunakan modul typing. Saya tidak berpikir typing.Type adalah yang tepat karena itu juga berlaku untuk objek:

>>> class A: pass
>>> a = A()

>>> def test(cl: typing.Type) -> typing.Type:
...     return type(cl)

>>> test(A)
>>> type
>>> isinstance(A, typing.Type)
>>> True

>>> test(a)
>>> type
>>> isinstance(A, typing.Type)
>>> False

>>> test('A')
>>> str
>>> isinstance(A, typing.Type)
>>> False

Haruskah anotasi berfungsi seperti ini? Bukankah intinya argumen beranotasi harus membatasi pemanggilan metode untuk mengenali hanya jenis argumen yang benar?

0
mrs-qv7 28 Februari 2020, 18:01

1 menjawab

Jawaban Terbaik

'Jenis' memang hal yang tepat untuk digunakan. Misalnya, jika Anda mencoba memeriksa jenis program berikut menggunakan pemeriksa jenis seperti mypy...

from typing import Type

class A: pass

# To be even more precise, have the type signature be
# '(cls: Type[T]) -> Type[Type[T]]' where T is some TypeVar.
def test(cls: Type) -> Type:
    return type(cls)

a = A()

test(A)
test(a)
test('A')

... Anda berakhir dengan kesalahan berikut, yang saya yakini adalah apa yang Anda harapkan:

test.py:13: error: Argument 1 to "test" has incompatible type "A"; expected "Type[Any]"
test.py:14: error: Argument 1 to "test" has incompatible type "str"; expected "Type[Any]"
Found 2 errors in 1 file (checked 1 source file)

Jika Anda bertanya mengapa petunjuk jenis ini tidak diperiksa oleh Python itu sendiri dan mengapa Anda perlu menggunakan pemeriksa jenis pihak ketiga, lihat Apa itu ketik petunjuk di Python 3.5?.

1
Michael0x2a 28 Februari 2020, 19:10