কোনও ভেরিয়েবলের তালিকা বা টিপল হলে পরীক্ষা করুন


234

পাইথনে, কোনও ভেরিয়েবলের একটি তালিকা বা একটি টুপল থাকে তা পরীক্ষা করার সর্বোত্তম উপায় কোনটি? (যেমন একটি সংগ্রহ)

isinstance()এখানে পরামর্শ মত মন্দ কি ? http://www.canonical.org/~kragen/isinstance/

আপডেট: আমি একটি স্ট্রিং থেকে একটি তালিকা আলাদা করতে চাই সবচেয়ে সাধারণ কারণ হ'ল যখন আমার কাছে কিছু অনির্দিষ্টকালের জন্য গভীর নেস্টেড ট্রি / স্ট্রিংগুলির তালিকাগুলির তালিকার তালিকাগুলির ডেটা-কাঠামো রয়েছে যা আমি পুনরাবৃত্তাকারী অ্যালগরিদমের সাথে অন্বেষণ করছি এবং আমার প্রয়োজন আমি কখন "পাতা" নোডগুলিতে আঘাত করেছি তা জানতে।


72
প্রকারভেদে টাইপ-চেকিংকে ব্যাপকভাবে বর্জন করা কিছুটা সহজ ile এটি ভাষার অংশ। এটি যদি খুব খারাপ হয় তবে এটি অপসারণের জন্য কারও একটি পিইপি লিখতে হবে।
অ্যাডাম ক্রসল্যান্ড

4
@ অ্যাডাম ক্রসল্যান্ড: "এটি ভাষার অংশ।" ঠিক শূন্য দ্বারা বিভাগ। এটা এড়ানো যায়। এই ক্ষেত্রে, অতিরিক্ত তথ্য ব্যতীত, এটি সম্ভবত সম্পূর্ণ অযথা। পাইথনে সর্বাধিক প্রকারের পরীক্ষা করা অপ্রয়োজনীয়। যেহেতু সবই অযথা নয়, কিছু প্রকারের চেকিংয়ের উপস্থিতি থাকা দরকার। তবে এর অর্থ এই নয় যে এটি সহায়ক, মূল্যবান বা একটি ভাল ধারণা।
এসলট

11
সুতরাং আপনি বলছেন যে কিছু প্রকারের চেকিং দরকার, তবে তা সত্ত্বেও, এটি অকেজো, মূল্যহীন এবং একটি খারাপ ধারণা। দুঃখিত, এটি ঠিক বোঝায় না।
গ্লেন মেইনার্ড 22

18
"এক্সএক্সএক্সএকটি দুষ্টই" খারাপ ধারণা পোষণ করা, "আপনি যেভাবে XXX করতে বলছেন তা বোঝানোর জন্য সংক্ষিপ্ত বিবরণী বোঝায় যে এটি কখন ব্যবহার করা উচিত তা আপনি বুঝতে পারবেন না এবং আপনি অবশ্যই অন্য কিছু চান"। সম্ভবত এখানে কেস।
গ্লেন মেইনার্ড

2
আমি এটিকে বড় হিসাবে খারাপ হিসাবে বরখাস্ত করিনি। এটি কখন খারাপ এবং কখন ন্যায়সঙ্গত তা সম্পর্কে আমি একটি ছোট রচনা লিখেছিলাম। সেই প্রবন্ধটি অনেকগুলি বিষয় হতে পারে - সঠিক, ভুল, পরিষ্কার, অস্পষ্ট, উপভোগযোগ্য, বিরক্তিকর - তবে একটি জিনিস এটি কৌশলটির বিস্তৃত বরখাস্ত নয়।
ক্রেজেন জাভিয়ার সিটেকার

উত্তর:


101

isinstanceআপনার প্রয়োজন হলে এগিয়ে যান এবং ব্যবহার করুন । এটি কিছুটা খারাপ, কারণ এটি কাস্টম সিকোয়েন্সগুলি, পুনরাবৃত্তিকারী এবং অন্যান্য জিনিসগুলি বাদ দেয় যা আপনার সম্ভবত প্রয়োজন হতে পারে। তবে, কখনও কখনও আপনার যদি অন্যরকম আচরণ করা প্রয়োজন তবে উদাহরণস্বরূপ, যদি কোনও স্ট্রিং পাস করে। আমার পছন্দটি স্পষ্টভাবে চেক করা strবা এটির জন্য পছন্দ করতে হবে unicode:

import types
isinstance(var, types.StringTypes)

বিশেষ দ্রষ্টব্য কি ভুল হচ্ছে না তে types.StringTypeজন্য types.StringTypes। পরেরটি অন্তর্ভুক্ত করে strএবং unicodeবস্তুগুলি।

দ্য typesমডিউল, অনেকে মনে করেন শুধু বস্তুর ধরন বিরুদ্ধে সরাসরি পরীক্ষণ পক্ষে অপ্রচলিত হতে তাই যদি আপনি বরং উপরে ব্যবহার করবেন চাই, আপনি অন্যথায় স্পষ্টভাবে বিরুদ্ধে পরীক্ষা করতে পারবেন strএবং unicode, এভাবে:

isinstance(var, (str, unicode)):

সম্পাদনা:

আরও ভাল হয়:

isinstance(var, basestring)

সম্পাদনা শেষ করুন

এর যে কোনও একটির পরেও আপনি এমন আচরণে ফিরে যেতে পারেন যেন আপনি একটি সাধারণ ক্রম পেয়ে যাচ্ছেন, অ-সিকোয়েন্সগুলি যথাযথ ব্যতিক্রমগুলি বাড়িয়ে দেয়।

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


2
প্রকারের মডিউলটি একটি historicalতিহাসিক নিদর্শন bit ডকস.পাইথন.আর . / ডেভিড / লিবারি / টাইপস.চ.টি.এম.এল . মডেল-টাইপগুলিতে উল্লিখিত হিসাবে যদি আপনার সত্যিই টাইপটি পরীক্ষা করা strউচিত তবে types.StringTypeএটির জন্য কেবলমাত্র একটি উপনাম ব্যবহার করার পরিবর্তে আপনাকে কেবল এটি সরাসরি ব্যবহার করা উচিত । তবে আমি মনে করি না যে এই উত্তরটি জিজ্ঞাসিত প্রশ্নের উত্তর দিয়েছে, কারণ এটি ছিল "একটি সংগ্রহ"। আপনি abcমডিউলটি তৈরি করার জন্য অজগরটি যথেষ্ট নতুন ব্যবহার না করে থাকেন যা আপনি isinstanceযাচাই করতে ব্যবহার করতে পারেন , এবং তারপরেও আমি যদি সম্ভব হয় তবে চেকটি এড়িয়ে চলার পরামর্শ দেব।
mzz

1
assert isinstance(u'abc', str) == False। আমি সম্মত হই যে typesমডিউলটি ব্যবহার না করে সরাসরি প্রকারের বিরুদ্ধে পরীক্ষা করা ভাল , তবে types.StringTypesএমন কিছু করেন যা strনা করে: এটি সত্য strএবং এর জন্য unicodeবস্তু দেয়। আমি বিকল্প হিসাবে একটি ডাবল চেক প্রস্তাব আমার প্রতিক্রিয়া সম্পাদনা করব।
jcdyer

1
আমি বুঝতে পেরেছি যে সংগ্রহের জন্য সরাসরি চেক করার প্রশ্নের উত্তর আমি সরাসরি দেইনি, তবে প্রকৃত প্রশ্নটি জিজ্ঞাসা করা হয়েছিল " isinstanceখারাপ কি ?" এবং আমি একটি পাল্টা উদাহরণ দিয়েছি যা (1) এর অ-মন্দ ব্যবহার isinstance, কারণ ফ্যালব্যাক থাকার অর্থ এটি হাঁসচক্র ভাঙবে না, এবং (2) খুব সাধারণ অনুপ্রেরণার জন্য একটি ভাল সমাধান যা লোকেরা যাচাই করতে চেয়েছিল তাদের জন্য কিছু হ'ল একটি listবা tuple(অর্থাত্ স্ট্রিংগুলি থেকে বিচ্ছিন্ন করার জন্য)।
jcdyer

আমি সম্মত হলাম, যে সতর্কতার সাথে প্রায়শই কাস্টম ধরণের ক্ষেত্রেও স্ট্রিংয়ের মতো আচরণ করা কার্যকর। তবে পাইথনের ওও কেবল এতদূর যায় ...
ক্রেজেন জাভিয়ার সিটেকার

নেই class Foo(str): passকি আপনি চান?
jcdyer

567
if type(x) is list:
    print 'a list'
elif type(x) is tuple:
    print 'a tuple'
else:
    print 'neither a tuple or a list'

1
কাজ করছে বলে মনে হচ্ছে না: টাইপ করুন ([]) ==> তালিকা; টাইপ ([]) হল ===> মিথ্যা
স্টেন

3
পাইথনে ২.7.৫: type([]) is listফেরতTrue
ডেভিড জিগার

54
type(x) in [list,tuple]খাটো হয়।
অ্যালেক্স হলকম্ব

যদি x এবং টাইপ (x) তালিকা থাকে: [] অমিল থেকে বাঁচতে
কেনিচী শিবাটা

আমাকে এত নিচে স্ক্রোল করতে হয়েছিল। : ডি
ithত্বিক

38

isinstanceযতক্ষণ না এটি অনর্থক না হয় ততক্ষণ ব্যবহারে কোনও ভুল নেই । যদি কোনও ভেরিয়েবল কেবল একটি তালিকা / টুপল হওয়া উচিত তবে ইন্টারফেসটি নথিভুক্ত করুন এবং কেবল এটি ব্যবহার করুন। অন্যথায় একটি চেক পুরোপুরি যুক্তিসঙ্গত:

if isinstance(a, collections.Iterable):
    # use as a container
else:
    # not a container!

এই ধরণের চেকটির কিছু ভাল ব্যবহারের ক্ষেত্রে রয়েছে, যেমন স্ট্যান্ডার্ড স্ট্রিং উইথ / এন্ড উইথ সহ পদ্ধতিগুলির সাথে (যদিও সঠিক হতে পারে তবে এটি সি-তে প্রয়োগ করা হয় এটি একটি টিউপল কিনা তা দেখার জন্য - এটি একাধিক উপায় ছাড়াও রয়েছে) আপনার লিঙ্কটি নিবন্ধে উল্লিখিত হিসাবে এই সমস্যাটি সমাধান করার জন্য)।

একটি স্পষ্ট চেকটি প্রায়শই ধারক হিসাবে বস্তুটি ব্যবহার করার চেষ্টা করা এবং ব্যতিক্রম হ্যান্ডেল করার চেয়ে ভাল that যা কোড সহ সমস্ত ধরণের সমস্যা আংশিক বা অপ্রয়োজনীয়ভাবে চালিত হতে পারে।


15
কোনও ভেরিয়েবলটি পুনরাবৃত্তিযোগ্য কিনা তা যাচাই করার এটি দুর্দান্ত উপায়। তবে এটি সম্ভবত এই প্রশ্নের উদ্দেশ্য নিয়ে কাজ করবে না। পরামর্শ দিন যে একটি স্ট্রিং খুব বারবারযোগ্য এবং সম্ভবত একটি মিথ্যা ধনাত্মক তৈরি করবে।
কোরি ও।

একটি setবস্তুও পুনরাবৃত্তিযোগ্য, যার অর্থ আপনি যখন অবশ্যই এটি থেকে উপাদানগুলি পপ করতে পারেন তবে এটি একটি নির্দিষ্ট ক্রমের গ্যারান্টি দেয় না যা নির্দিষ্ট অ্যালগরিদমের জন্য খুব বিপজ্জনক জিনিস is যখন উপাদানগুলির ক্রমটি অর্ডার করার বিষয়টি বিবেচনা করে তখন এই স্নিপেট ব্যবহার করে একটি অ্যালগরিদম সম্ভাব্যভাবে বিভিন্ন রানে বিভিন্ন ফলাফল তৈরি করতে পারে!
ko

14

ক্রম হওয়ার দরকার হিসাবে যুক্তিটি নথিভুক্ত করুন এবং এটি ক্রম হিসাবে ব্যবহার করুন। প্রকারটি যাচাই করবেন না।


12

কেমন হয়: hasattr(a, "__iter__")?

এটি জানায় যে প্রত্যাবর্তিত বস্তুটি জেনারেটর হিসাবে পুনরাবৃত্তি হতে পারে। ডিফল্টরূপে, টিপলস এবং তালিকাগুলি ক্যান, তবে স্ট্রিংয়ের ধরণগুলি নয়।


আমি এটি সত্যিই দরকারী খুঁজে পেয়েছি।
জাভাদবা

8
স্ট্রিংগুলির জন্য সত্য ফলাফল (কমপক্ষে পাইথন 3 এ)।
জিজিবার্থ এডাম

2
এটি ভুল উত্তর। যেহেতু টাইপ 'str' এর পদ্ধতিও ' ইটার ' রয়েছে। @ সিজিবার্থ অ্যাডাম ঠিক বলেছেন। 'সেট' টাইপটিও পুনরাবৃত্তিযোগ্য তবে প্রবর্তনযোগ্য নয়।
PADYMKO

এছাড়াও dicts আছে __iter__
thet

আপনি যদি চালিয়ে যান তবে কোনও কাস্টম প্রকারের __iter__কোনও কারণ থাকতে পারে ...
আলেকজান্ডার ইরবিস

10

পাইথন ২.৮ type(list) is listরিটার্নে false
আমি এই ধরণেরটিকে ভয়ঙ্কর উপায়ে তুলনা করার পরামর্শ দেব:

if type(a) == type([]) :
  print "variable a is a list"

(কমপক্ষে আমার সিস্টেমে ম্যাক ওএস এক্স ইয়োসেমাইটে অ্যানাকোন্ডা ব্যবহার করে)


1
টাইপ (ক) তালিকাটি কি মিথ্যা হিসাবে মূল্যায়ন করে?
দিমিত্রি সিন্টসভ

4
আপনার অর্থ পাইথন ২.7.৮? পাইথন.আর।
কার্ল

হ্যালো, আমি কৌতূহলী: কেন আপনি আপনার উদাহরণটিকে "ভয়ঙ্কর" মনে করেন?
শেঠ কনেল

type(list) is listআয় Falseকারণ type(list)হয় typeনা listtype(list()) is listবা অন্য কোন সঙ্গে উদাহরণস্বরূপ তালিকার ফিরে আসবে True
মাইকেল গ্রিন

8

পাইথন "হাঁসের টাইপিং" ব্যবহার করে, অর্থাত্ যদি হাঁসের মতো কোনও পরিবর্তনশীল কোয়াক্স থাকে তবে এটি অবশ্যই হাঁস হতে হবে। আপনার ক্ষেত্রে, আপনি সম্ভবত এটি পুনরাবৃত্তিযোগ্য হতে চান বা আপনি নির্দিষ্ট সূচীতে আইটেমটি অ্যাক্সেস করতে চান। আপনার কেবল এটি করা উচিত: অর্থ কোনও ব্লকের ভিতরে for var:বা var[idx]অভ্যন্তরটি ব্যবহার করুন tryএবং আপনি যদি কোনও ব্যতিক্রম পান তবে এটি হাঁস ছিল না ...


7
এটির সাথে সমস্যাটি যদি varএকটি স্ট্রিং হয় তবে সম্ভবত অপ্রত্যাশিত ফলাফলের পুনরাবৃত্তি ঘটবে।
ব্রায়ান এম হান্ট

ব্রায়ান এম হান্টের বক্তব্যটি সত্ত্বেও অনুমতি ব্যতিরেকে ক্ষমা চাওয়ার ক্ষেত্রে তার যথেষ্ট অজগর সমাধান।
Géza Török


3

আপনি যদি foo[123]ভেরিয়েবলের সাথে স্বরলিপিটি ব্যবহার করতে পারেন কিনা তা জানতে হলে , আপনি কোনও __getitem__বৈশিষ্ট্যের অস্তিত্ব পরীক্ষা করতে পারেন (সূচী দ্বারা অ্যাক্সেস করার সময় পাইথন বলে যা)hasattr(foo, '__getitem__')


2

যদি আপনি সত্যিই ফাংশন আর্গুমেন্ট হিসাবে ঠিক যে কোনও কিছুই হ্যান্ডেল করতে চান তবে আরও জটিল পরীক্ষা করতে হবে।

type(a) != type('') and hasattr(a, "__iter__")

যদিও, সাধারণত এটি বানানই যথেষ্ট যে কোনও ফাংশন প্রত্যাবর্তনযোগ্য প্রত্যাশা করে এবং তারপরে কেবল পরীক্ষা করে type(a) != type('')

এছাড়াও এটি ঘটতে পারে যে স্ট্রিংয়ের জন্য আপনার একটি সহজ প্রক্রিয়াজাতকরণের পথ রয়েছে বা আপনি দুর্দান্ত হতে চলেছেন এবং একটি বিভাজনও করতে পারেন ইত্যাদি, তাই আপনি স্ট্রিংগুলিতে চিৎকার করতে চান না এবং যদি কেউ আপনাকে কোনও অদ্ভুত কিছু প্রেরণ করে তবে কেবল তার কাছে যেতে দিন একটি ব্যতিক্রম.


2

কোনও ভেরিয়েবলের তালিকা বা টিপল হয় বা সাধারণত ভেরিয়েবলের পরীক্ষা করা হয় তা খুঁজে বের করার আর একটি সহজ উপায় হ'ল:

    def islist(obj):

        if ("list" in str(type(obj)) ): return True

        else : return False

1

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

>>> a = (1,)
>>> type(a)
(type 'tuple')
>>> a = [1]
>>> type(a)
(type 'list')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.