2015-08-25 5 views
9

मुझे पायथन में कक्षा प्रकारों के लिए एक प्रकार का संकेत कैसे लिखना चाहिए?पायथन प्रकार संकेत: एक्स को कैसे बताना है फू के लिए एक उप-वर्ग है?

class A(object): 
    pass 

class B(A): 
    pass 

def register(cls: type[A]): 
    assert issubclass(cls, A) 

register(A) 
register(B) 

type[A] सही तरीका यह लिखने के लिए है: इस कोड पर विचार करें? यदि मैं सिर्फ cls: A का उपयोग करता हूं तो इसका अर्थ यह होगा कि clsA का एक उदाहरण है, लेकिन मैं कहना चाहता हूं कि cls एक वर्ग/प्रकार है, जो कम से कम A उप-वर्ग है।

विशेष रूप से, मैं जो संकेत देना चाहता हूं वह यह है कि पैरामीटर एक Django मॉडल प्रकार होना चाहिए।

+0

यदि आप PyCharm में टाइपहिंट (डॉक्टर स्ट्रिंग संकेत) की खोज करेंगे तो मैं आपको परेशान करता हूं: वर्तमान में आप PyCharm में कक्षा उपप्रकारों के लिए टाइपहिंट्स का उपयोग नहीं कर सके। –

उत्तर

8

ऐसा लगता है कि अन्य मौजूदा (22 सितंबर 2016) उत्तर यहां गलत हैं। पीईपी 484 (टाइप हिंट्स के बारे में) के अनुसार, कक्षा वस्तुओं के प्रकार के लिए एक संकेत मौजूद है, जिसे Type[C] कहा जाता है। और typing मॉड्यूल के दस्तावेज के अनुसार, आप जो भी चाहते हैं उसे प्राप्त करने के लिए आप typing.Type[C] का उपयोग कर सकते हैं। मैं खुद को पाइथन 3.5.2 के साथ उपयोग कर रहा हूं।

the PEP का हवाला देते हुए:

कभी-कभी आप विशेष वर्ग वस्तुओं है कि किसी वर्ग से विरासत में, वर्ग वस्तुओं के बारे में बात करना चाहता हूँ। इसे टाइप [सी] के रूप में लिखा जा सकता है जहां सी एक वर्ग है। स्पष्टीकरण के लिए: जबकि सी (जब एनोटेशन के रूप में उपयोग किया जाता है) कक्षा सी के उदाहरणों को संदर्भित करता है, टाइप [सी] सी के उप-वर्गों को संदर्भित करता है।

और के हवाले से the docs:

एक चर सी के साथ एनोटेट इसके विपरीत प्रकार सी के एक मूल्य स्वीकार करते हैं, एक चर के साथ प्रकार [C] एनोटेट मानों वर्गों खुद को कर रहे हैं स्वीकार कर सकते हैं कर सकते हैं - विशेष रूप से, यह सी

के वर्ग वस्तु स्वीकार करते हैं और अपने विशिष्ट उदाहरण का जिक्र होगा:

import typing 

class A(object): 
    pass 

class B(A): 
    pass 

def register(cls: typing.Type[A]): 
    assert issubclass(cls, A) 

register(A) 
register(B) 

आप mypy का उपयोग करके इस तरह के कोड को स्थिर रूप से देख सकते हैं, और इसे सरल मामलों में काम करना चाहिए - सावधान रहें कि मिस्पी प्रगति पर एक काम है, क्योंकि अब टाइप [सी] संकेत के बारे में कई मुद्दे खुले हैं।

+0

बहुत बहुत धन्यवाद! यह जानकर खुशी हुई कि यह सब के बाद संभव है। – vdboor

4

अपने सामान्य मामले को हल करने के लिए, आपको एक उपयुक्त __subclasscheck__ के साथ मेटाक्लास लिखना होगा। संभव, लेकिन बोझिल।

Django मॉडल कक्षाएं, एक स्पष्ट metaclass पहले से मौजूद है की अपने विशिष्ट मामले में, तो टिप्पणी करने के लिए है कि काम करना चाहिए:

import django.db.model as model 

def register(cls: model.base.ModelBase): ... 

यह काम करेंगे क्योंकि isinstance(models.Model, models.base.ModelBase) सच है।

संबंधित मुद्दे

 संबंधित मुद्दे