পাইথন চেক করে তালিকায় কি কোনও প্রকারের আছে?


91

আমি কীভাবে পাইথোনিকভাবে করবো:

var = 7.0
var_is_good = isinstance(var, classinfo1) or isinstance(var, classinfo2) or isinstance(var, classinfo3) or ... or  isinstance(var, classinfoN)

নির্বোধ মনে হয় আমি ক্লাসিনফোগুলির তালিকায় কেবল পাস করতে পারি না:

var_is_good = isinstanceofany( var, [classinfo1, classinfo2, ... , classinfoN] )

তাহলে isinstanceofanyফাংশনটি কী?


যদি এটি একটি সংখ্যার মতো যোগ করে, সংখ্যার মতো বিয়োগ করে, একটি সংখ্যার মতো গুণিত হয় ... এটি কেন একটি সংখ্যা বলে জানতে হবে? আরও তথ্যের জন্য হাঁসের টাইপিং দেখুন ।
মাকোটো

আমার নির্দিষ্ট ব্যবহারের ক্ষেত্রে একটি ফাংশন রয়েছে যা একটি ফাংশন দেয় (ফাংশন যা প্রত্যাবর্তন করে (হয় একটি numberবা এটি একটি সিম্পি এক্সপ্রেশন দেয়))। আমি যাচাই করতে চাই যে আমি যে ফাংশনটি জেনারেট করেছি তা যখন এটি অন্য ফাংশনগুলিতে পাস করি তখন যা করা উচিত তা করে।
ডি অ্যাডামস 21

আপনার ফাংশন কেন সমজাতীয় কিছু ফিরিয়ে দেয় না? এখানেই গন্ধ আছে; আপনি হাঁসের টাইপিংয়ের সাথে দ্রুত এবং আলগা হয়ে উঠতে পারেন তবে আপনি কী ফিরে আসবেন তাতে আপনার সামঞ্জস্য হওয়া উচিত।
মাকোটো

আমার ধারণা আমি সর্বদা একটি সিম্পি এক্সপ্রেশনটি ফিরিয়ে দিতে পারি যা কখনও কখনও কোনও সংখ্যার কাছে মূল্যায়ন করে এবং কখনও কখনও এর ভিতরে ভেরিয়েবল থাকে।
ডি অ্যাডামস 21

আপনি এখানে করতে চান তা আমি ভাবছি; একাধিক বিভিন্ন প্রকারের পরিবর্তে, এক প্রকারটি ফেরত দিন এবং যদি প্রয়োজন হয় তবে পরিবর্তে এটি একটি সংখ্যায় কম করুন।
মাকোটো

উত্তর:


201

isinstance()দ্বিতীয় আর্গুমেন্টের জন্য ক্লাসগুলির একটি tuple লাগে প্রথম যুক্তিটি সেই অনুক্রমের যে কোনও ধরণের উদাহরণ হিসাবে উপস্থিত হলে এটি সত্য হবে :

isinstance(var, (classinfo1, classinfo2, classinfo3))

অন্য কথায়, isinstance() ইতিমধ্যে বাক্সের বাইরে এই কার্যকারিতাটি সরবরাহ করে।

isinstance()ডকুমেন্টেশন থেকে :

ক্লাসিনফো যদি শ্রেণি অবজেক্ট না টাইপ অবজেক্ট না হয় তবে এটি শ্রেণি বা টাইপ অবজেক্টগুলির একটি টিপল হতে পারে বা পুনরাবৃত্তভাবে এ জাতীয় অন্যান্য টিপল থাকতে পারে (অন্যান্য ক্রমের ধরণগুলি গ্রহণ করা হয় না)।

জোর আমার; পুনরাবৃত্ত প্রকৃতি নোট করুন; (classinfo1, (classinfo2, classinfo3))এছাড়াও একটি বৈধ বিকল্প।


12

আপনি ইতিমধ্যে আপনার প্রশ্নের শিরোনামের সাথে বেশ ঘনিষ্ঠ ছিলেন। আপনি ব্যবহার করতে পারেন anyএবং একটি তালিকা:

var = 7.0
var_is_good = any([isinstance(var, classinfo1),
                   isinstance(var, classinfo2),
                   isinstance(var, classinfo3), ...
                   isinstance(var, classinfoN)])

তবে isinstanceপ্রকাশের দস্তাবেজগুলি অনুসন্ধান করা :

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

এর অর্থ এটি করার সর্বোত্তম উপায়

var = 7.0
var_is_good = isinstance(var, (classinfo1,
                               classinfo2,
                               classinfo3,
                               ...,
                               classinfoN))

4
isinstanceশুধুমাত্র classinfoপরিবর্তনের সাথে পুনরাবৃত্তি করা আমার কাছে খুব বেশি পাইথোনিক বলে মনে হয় না।
মাকোটো

4
ব্যবহার করে দেখুন var.__class__। তুমি কি এটাই চাও? @ মাকোটো: আমি সম্মত পাইথোনিক মোটেও নয়!
ফ্ল্যামেনকো

@ মাকোটো ইয়ুপ তবে এটি এমন কিছু ছিল যা ডি অ্যাডামস সম্ভবত "যে কোনও" এর জন্য দস্তাবেজগুলি সন্ধান করে সহজেই খুঁজে পেতে পারতেন। আমি আমার উত্তরটি আরও ভাল সংস্করণে প্রসারিত করেছি ... তবে স্পষ্টতই মার্টিজান পিটারগুলি আরও দ্রুত ছিল ... আরও একবার।
মার্টিন থোমা 21

4
any()একটি তালিকা সহ .. অর্থহীন। জেনারেটর এক্সপ্রেশন ব্যবহার করুন যদি আপনার অবশ্যই ব্যবহার করা হয় any()তবে কমপক্ষে আপনি প্রারম্ভিক প্রস্থানটির সুবিধা পাবেন।
মার্টিজন পিটারস

আমার মনে isinstanceহয় টিপল সহ এই পথ চলার উপায়। আমি কেবল সমাধানটির সাথে উল্লেখ করতে চেয়েছিলাম anyকারণ মনে হয়েছিল শিরোনামে তিনি যা চাইছেন।
মার্টিন থোমা 21 ই

4

এই আপনার সমস্যার সমাধান হবে:

valid_instance_types = <tuple of types you want to allow>
var_is_good = isinstance(var, valid_instance_types)

ডকুমেন্টেশনের ভিত্তিতে আপনি বিভিন্ন ধরণের মানগুলি পাস করতে পারেন এমন অনেকগুলি উপায় রয়েছে isinstance

এছাড়াও আপনি দেখব পারে ইন্দ্রি়পরায়ণতাপূর্ণ আপনি একটি আরো জটিল বৈধতা যার এই মাত্র একটি অংশ করতে চেষ্টা করছেন।


isinstance () ইতিমধ্যে এই কার্যকারিতা সরবরাহ করে, 2 য় আর্গুমেন্ট হিসাবে যাচাই করার জন্য সমস্ত প্রয়োজনীয় প্রকারের সাথে একটি টিপল পাস করুন
আরএফভি

@ আরএফভি 5 এস হ্যাঁ .... আমি এখানে যে উদাহরণটি দিয়েছি তা এটি দেখায়। আপনার আপত্তি কি?
নাথানিয়েল ফোর্ড

1

আপনার সাধারণত ব্যবহার করা উচিত নয় isinstance, তবে আপনি যা করতে চাইছেন তা কোনও () বিল্টিন ফাংশন দিয়ে সম্পাদন করা যেতে পারে ।

var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])

7
এটি ওভারকিল; isinstance()ব্যবহার না করে বক্সের বাইরে কার্যকারিতা সরবরাহ করে any()
মার্টিজন পিটারস

@ মার্তিজজনপিটারস আমি বুঝতে পারি নি যে আইসনস্ট্যান্স একাধিক ধরণের নিতে পারে তবে আমি উত্তরটি এখনও ভাল বলে মনে করি কারণ প্রশ্নটি আরও বিস্তৃতভাবে নেওয়া যেতে পারে "নির্দিষ্ট ফাংশন থেকে প্রত্যাবর্তনের মানগুলির মধ্যে আমি কীভাবে পরীক্ষা করব? বিভিন্ন প্যারাম সহ সত্য "
চাদ এস।

আপনার ব্যবহার isinstance()করা উচিত কিনা তা অপ্রাসঙ্গিক।
আরএফভি 22'20

@ চ্যাডস আমি আপনাকে জিজ্ঞাসা করতে চাই আপনি কেন ভাবেন যে তিনি ব্যবহার করবেন না isinstance()? ধন্যবাদ.
পরিচয়

কারণ পাইথন এসচিউজ টাইপ চেকিং করে। সামান্য সুবিধার জন্য এটি প্রচুর অতিরিক্ত কোড (এবং সিপিইউ চক্র)। হাঁসের টাইপিং পছন্দ করা হয়।
চাদ এস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.