Python মধ্যে টাইপ চেক করতে ক্যানোনিকাল উপায় কি?




types (6)

আমি পাইথন মত একটি গতিশীল ভাষা ব্যবহার সম্পর্কে শীতল জিনিস আপনি সত্যিই এমন কিছু পরীক্ষা করতে হবে না।

আমি শুধু আপনার বস্তুর প্রয়োজনীয় পদ্ধতি কল এবং একটি AttributeError ধরা হবে। পরবর্তীতে এটি আপনাকে বিভিন্ন কাজগুলি সম্পন্ন করার জন্য অন্যান্য (আপাততঃ সম্পর্কিত নয়) বস্তুর সাথে আপনার পদ্ধতিগুলিকে কল করার অনুমতি দেবে, যেমন পরীক্ষার জন্য একটি বস্তুকে ঠকানো।

আমি urllib2.urlopen() ওয়েব থেকে ডেটা পাওয়ার সময় এটি অনেক ব্যবহার করেছি যা বস্তুর মত একটি ফাইল প্রদান করে । এটি কোনও ফাইল থেকে যে কোনও পদ্ধতিতে পাঠানো যেতে পারে, কারণ এটি একই read() পদ্ধতিটি প্রকৃত ফাইল হিসাবে প্রয়োগ করে।

কিন্তু আমি নিশ্চিত করছি যে isinstance() ব্যবহার করার জন্য একটি সময় এবং স্থান আছে, অন্যথা এটি সম্ভবত সেখানে থাকবে না :)

একটি প্রদত্ত বস্তু একটি নির্দিষ্ট ধরনের কিনা তা পরীক্ষা করার সেরা উপায় কি? কিভাবে একটি নির্দিষ্ট ধরনের থেকে বস্তুর উত্তরাধিকার পরীক্ষা করে দেখুন?

চলো আমি একটি বস্তু আছে বলে। কিভাবে আমি এটা str একটি কিনা চেক করবেন?


একটি বস্তুর ধরন চেক করার সবচেয়ে পাইথনিক উপায় ... এটি পরীক্ষা না করা।

যেহেতু পাইথন হাঁসের টাইপিংকে উত্সাহিত করেছেন, তাই আপনাকে অবশ্যই try...except করতে হবে try...except অবজেক্টের পদ্ধতিগুলি ব্যবহার করার উপায় ছাড়া আপনি সেগুলি ব্যবহার করতে চান। তাই যদি আপনার ফাংশন একটি লেখার ফাইল বস্তুর সন্ধান করছে, তবে এটি file একটি উপশ্রেণী নয় তা পরীক্ষা করবেন না , কেবল এটির .write() পদ্ধতিটি ব্যবহার করার চেষ্টা করুন!

অবশ্যই, কখনও কখনও এই চমৎকার abstractions বিরতি এবং isinstance(obj, cls) আপনি প্রয়োজন কি। কিন্তু sparingly ব্যবহার করুন।


প্রশ্ন জিজ্ঞাসা করা এবং উত্তর দেওয়ার পরে, টাইপ ইঙ্গিত পাইথন যোগ করা হয়েছে । পাইথনে টাইপ ইঙ্গিতগুলি টাইপ করা যায় তবে স্ট্যাটিকালি টাইপ করা ভাষাগুলি থেকে একেবারে ভিন্ন ভাবে। Python এ টাইপ ইঙ্গিতগুলি কার্যকারিতার সাথে সম্পর্কিত রানটাইম অ্যাক্সেসযোগ্য ডেটা হিসাবে ফাংশনগুলির সাথে প্রত্যাশিত ধরনের আর্গুমেন্টগুলিকে সহযোগী করে এবং এইগুলি চেক করার জন্য এটির অনুমতি দেয় । টাইপ ইঙ্গিত সিনট্যাক্স উদাহরণ:

def foo(i: int):
    return i

foo(5)
foo('oops')

এই ক্ষেত্রে আমরা foo('oops') জন্য একটি ত্রুটি ট্রিগার করতে চাই, কারণ আর্গুমেন্টের এনটাইটেটেড প্রকার int । সংযুক্ত টাইপ ইঙ্গিতটি স্ক্রিপ্টটি সাধারণত চালানোর সময় একটি ত্রুটি ঘটবে না। যাইহোক, এটি এমন প্রত্যাশাগুলি বর্ণনা করে এমন ফাংশনে বৈশিষ্ট্য যোগ করে যা অন্যান্য প্রোগ্রামগুলি অনুসন্ধান করতে পারে এবং টাইপ ত্রুটিগুলির জন্য পরীক্ষা করতে পারে।

টাইপ ত্রুটি খুঁজে পেতে ব্যবহৃত অন্যান্য প্রোগ্রামগুলির মধ্যে একটি হল mypy :

mypy script.py
script.py:12: error: Argument 1 to "foo" has incompatible type "str"; expected "int"

(আপনাকে আপনার প্যাকেজ ম্যানেজার থেকে mypy ইনস্টল করতে হতে পারে। আমি মনে করি না এটি সিপিথন এর সাথে আসে কিন্তু মনে হয় এটি "আনুষ্ঠানিকতা" মাত্রা।)

এই ভাবে চেক টাইপ স্ট্যাটিকালি টাইপ করা সংকলিত ভাষায় টাইপ চেকিং থেকে ভিন্ন। কারণ পাইথনগুলিতে ধরনটি গতিশীল, টাইপ পরীক্ষণটি অবশ্যই রানটাইম এ করা উচিত, যা ব্যয় করে - এমনকি সঠিক প্রোগ্রামগুলিতেও - যদি আমরা জোরালোভাবে বলি যে এটি প্রতিটি সুযোগে ঘটে। স্পষ্ট টাইপ চেক প্রয়োজনের চেয়ে আরো বিধিনিষেধযুক্ত হতে পারে এবং অপ্রয়োজনীয় ত্রুটির কারণ হতে পারে (উদাহরণস্বরূপ যুক্তিটি আসলেই সম্পূর্ণ list টাইপ হতে পারে বা পর্যাপ্ত পরিমাণে যথেষ্ট কিছু?)।

স্পষ্ট টাইপ পরীক্ষণের ঊর্ধ্বগতি হল এটি পূর্বের ত্রুটিগুলি ধরতে পারে এবং হাঁসের টাইপের চেয়ে স্পষ্ট ত্রুটির বার্তা দেয়। হাঁসের ধরনটির সঠিক প্রয়োজনীয়তা কেবল বাহ্যিক ডকুমেন্টেশনের সাথে প্রকাশ করা যেতে পারে (আশা করা যায় এটি পুঙ্খানুপুঙ্খ এবং নির্ভুল) এবং অসঙ্গতিপূর্ণ ধরণের ত্রুটিগুলি উদ্ভূত হতে পারে।

পাইথন এর টাইপ ইঙ্গিতটি বোঝার জন্য বোঝানো হয় যেখানে প্রকারগুলি নির্দিষ্ট এবং চেক করা যেতে পারে তবে স্বাভাবিক কোড কার্যকর করার সময় কোন অতিরিক্ত খরচ নেই।

typing প্যাকেজটি টাইপ ভেরিয়েবলগুলি অফার করে যা নির্দিষ্ট ধরণের প্রয়োজন ছাড়াই প্রয়োজনীয় আচরণগুলি প্রকাশ করতে টাইপ ইঙ্গিতে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, এটি Iterable এবং Callable মতো ভেরিয়েবলগুলিকে অন্তর্ভুক্ত করে যা তাদের আচরণের সাথে যেকোনো ধরনের প্রয়োজনীয়তা নির্দিষ্ট করতে নির্দেশ করে।

টাইপ ইঙ্গিতগুলি টাইপ করার জন্য সবচেয়ে পাইথনিক উপায় হলেও, এটি প্রায়শই আরও বেশি পাইথনিক যা টাইপগুলি টাইপ করতে এবং হাঁসের টাইপের উপর নির্ভর করে না। টাইপ ইঙ্গিতটি তুলনামূলকভাবে নতুন এবং জুরিরা তখনও এটির সবচেয়ে পাইথনিক সমাধান হয়। একটি অপেক্ষাকৃত অসঙ্গতিপূর্ণ কিন্তু খুব সাধারণ তুলনা: টাইপ ইঙ্গিতগুলি এমন একটি প্রকারের ডকুমেন্টেশন সরবরাহ করে যা প্রয়োগ করা যেতে পারে, কোডগুলিকে পূর্বে এবং সহজে বোঝার জন্য সহজে অনুমতি দেয়, ডক টাইপিং করতে পারে না এমন ত্রুটিগুলি ধরতে পারে এবং এটি স্থিরভাবে যাচাই করা যেতে পারে (অস্বাভাবিকভাবে জ্ঞান কিন্তু এটি এখনও রানটাইম বাইরে)। অন্যদিকে, হাঁস টাইপিং দীর্ঘ সময়ের জন্য পাইথনিক উপায় হয়েছে, স্ট্যাটিক টাইপের জ্ঞানীয় ওভারহেড প্রয়োগ করা হয় না, কম ক্রিয়াপদ, এবং সমস্ত কার্যকর ধরনের এবং তারপর কিছু গ্রহণ করবে।


হাঁস টাইপিং বিপজ্জনক যখন বুদ্ধিমান ছাড়া মন্দ কেন এখানে একটি উদাহরণ। উদাহরণস্বরূপ: এখানে পাইথন কোড (সম্ভাব্য যথাযথ ইন্ডেন্টিং বাদ দেওয়া), নোট করুন যে এই পরিস্থিতিটি ইন্সটেন্স এবং ইস্যুব্লাসফক্স ফাংশনগুলি যত্ন নেওয়ার মাধ্যমে এড়ানো যেতে পারে যে যখন আপনাকে সত্যিই একটি হাঁসের প্রয়োজন হয়, তখন আপনি বোমা পাবেন না।

class Bomb:
    def __init__(self):
        ""

    def talk(self):
        self.explode()

    def explode(self):
        print "BOOM!, The bomb explodes."

class Duck:
    def __init__(self):
        ""
    def talk(self):
        print "I am a duck, I will not blow up if you ask me to talk."    

class Kid:
    kids_duck = None

    def __init__(self):
        print "Kid comes around a corner and asks you for money so he could buy a duck."

    def takeDuck(self, duck):
        self.kids_duck = duck
        print "The kid accepts the duck, and happily skips along"

    def doYourThing(self):
        print "The kid tries to get the duck to talk"
        self.kids_duck.talk()

myKid = Kid()
myBomb = Bomb()
myKid.takeDuck(myBomb)
myKid.doYourThing()

isinstance(o, str) যদি isinstance(o, str) হয় অথবা str থেকে উত্তরাধিকারী হয় এমন একটি প্রকারের হয় তবে true ফিরে আসবে।

type(o) is str হবে যদি true এবং যদি শুধুমাত্র একটি str হয়। o str থেকে উত্তরাধিকারী একটি টাইপ যদি এটি false ফিরে আসবে। ----


str বা isinstance str কোনো subclass এর একটি উদাহরণ কিনা তা পরীক্ষা করার জন্য, isinstance ব্যবহার isinstance (এটি "ক্যানোনিকাল" উপায় হতে পারে):

if isinstance(o, str):

o এর ধরনটি ঠিক আছে str (সাবস্ক্লেস বাদে) কিনা তা পরীক্ষা করতে:

if type(o) is str:

নিম্নলিখিত কাজ করে, এবং কিছু ক্ষেত্রে দরকারী হতে পারে:

if issubclass(type(o), str):

প্রাসঙ্গিক তথ্যের জন্য পাইথন লাইব্রেরী রেফারেন্সে বিল্ট ইন ফাংশন দেখুন।

আরও একটি নোট: এই ক্ষেত্রে, যদি আপনি পাইথন 2 ব্যবহার করেন তবে আপনি আসলে এটি ব্যবহার করতে চান:

if isinstance(o, basestring):

কারণ এটি ইউনিকোড স্ট্রিংগুলিকেও ধরবে ( unicode str একটি উপশ্রেণী নয়; স্ট্রিং এবং unicode উভয় basestring উপশ্রেণী)। উল্লেখ্য, পাইথন 3 তে basestring আর বিদ্যমান নেই, যেখানে স্ট্রিংগুলি (স্ট্রিং) এবং বাইনারি ডেটা ( bytes ) কঠোর বিচ্ছেদ রয়েছে।

অন্যথায়, isinstance ক্লাস একটি tuple গ্রহণ করে। X যদি কোনও (sub, unicode) যেকোন উপসাগরীয় উদাহরণের একটি উদাহরণ হয় তা সত্য করে:

if isinstance(o, (str, unicode)):




types