2016-07-17 35 views
8

List olan Sequence bir alt sınıf:Neden Liste [str] değil Dizi alt sınıfı [str]

>>> issubclass(List[str], Sequence[str]) 
False 

Neden:

>>> from typing import List, Sequence 
>>> issubclass(List, Sequence) 
True 

ama List[str]Sequence[str] bir alt sınıfı değildir?

+1

Neden olmasın? 'List [str]' ve '' Sıra [str] 'örnekleri gibidir; jenerik türün belirli formları. 'list()', 'abc.Sequence()' ın bir alt sınıfı değildir. –

+0

Ya da farklı bir şekilde koydu: * Ne tür bir kullanım * Ne zaman açıklama [str] 've' Sıra [str] 'arasında bir IS-A ilişkisi var mı? –

cevap

1

List[str] ve Sequence[str] arasındaki bir IS-A ilişkisinin ek açıklamada kullanılması ne işe yarar?

Bu, götürülmesi gereken en önemli noktadır. Bir türün başka türde bir alt tip olup olmadığını kontrol etmek genellikle kodunuzu açıklama yazarken yapmanız gereken bir şey değildir. Bu genellikle fark edildi ve the nuking of __subclasscheck__ üzerinde bir tartışma neden nedeni.

states in a comment Mark Shannon gibi:

Bir tür türde bir alt tipi olup olmadığını kontrol etmek anlamlıdır, ama bu statik denetleyicisi işi olduğunu ve yazarak modülünde ait değil. konteyner tipi benzer ancak bunların alt metne türleri de farklı yerlerde

iki şekilde de, çekler all made in GenericMetas __subclasscheck__ olan jenerik tipler olarak is

için metaclass, şu anki uygulama durumlarda daha çok odaklandığı durumda, alt kodlanmış türler covariant or contravariant ise bağlı olarak yapılır.

issubclass(List[bool], List[int]) # checks if bool == int 

döner yanlış: Örneğin, List türleri ile subtype ilişki için kontrol gibi değildirler. (İlk durumda olduğu gibi), diğer yandan

issubclass(Sequence[bool], Sequence[int]) # checks if bool is a subclass of int 

, türleri için belirli bir türü olmayan: sekansları için, çeşitleri, örneğin, aşağıdaki verimlerde True olarak, bildirdiğinden vardır

issubclass(List, Sequence) 

__subclasscheck__GenericMeta'da delegate - __subclasscheck__ in ABCMeta - True olarak değerlendirilecektir. iki tip olduğu gibi, farklı ise

Son olarak,:

issubclass(List[str], Sequence[str]) 

ve issubclass call is an instance of GenericMeta baz sınıfı False geri döndürülür; Bu koşul, typing'daki türlerin çoğundan memnun. Durum ne olursa olsun, bu durumun gelecekteki bir sürümde mevcut olmayabileceği veya davranışının tamamen farklı olabileceğinden bahsedilmeye değer; modül hala geçici.

İlgili konular