কোনও বস্তুটি তালিকা বা টিপল (তবে স্ট্রিং নয়) তা কীভাবে পরীক্ষা করবেন?


443

ইনপুটটি একটি list/ tuple- তবে তা নয় তা নির্ধারণের জন্য আমি সাধারণত এটি করি str। কারণ অনেক সময় আমি বাগগুলিতে হোঁচট খেয়েছি যেখানে কোনও ফাংশন strভুল করে কোনও বস্তুকে পাস করে এবং লক্ষ্য ফাংশনটি for x in lstধরে নিই যে lstএটি আসলে একটি listবা tuple

assert isinstance(lst, (list, tuple))

আমার প্রশ্ন: এটি অর্জনের আরও ভাল উপায় আছে কি?


9
টাইপ (lst) তালিকা?
জ্যাকালোপ

1
isinstance নয় (কী, সিক্স। স্ট্রিং_ টাইপস)
ওয়াইএক্স

উত্তর:


332

পাইথন 2 এ (পাইথন 3 নয়):

assert not isinstance(lst, basestring)

আসলে কি চান অন্যথায় আপনি যা তালিকা মত আচরণ অনেকটা উপর ফসকান পাবেন, কিন্তু এর উপশ্রেণী নয় কি listবা tuple


91
হ্যাঁ, এটি সঠিক উত্তর। পাইথন 3 এ, basestringচলে গেছে এবং আপনি কেবল পরীক্ষা করে দেখুন isinstance(lst, str)
স্টিভেহা

5
তালিকার মতো আপনি পুনরাবৃত্তি করতে পারেন এমন প্রচুর জিনিস রয়েছে যেমন set, জেনারেটর এক্সপ্রেশন, পুনরুক্তি। বিদেশী জিনিস রয়েছে যেমন mmapকম বিদেশী জিনিস arrayযা তালিকার মতো কাজ করে এবং সম্ভবত আমি আরও কিছু ভুলে গিয়েছি।
নিক ক্রেগ-উড

50
এটি লক্ষণীয় যে lstমূলটি এটির পুনরাবৃত্তিযোগ্য গ্যারান্টি দেয় না (উদাহরণস্বরূপ কোনও int এই চেকটি পাস করবে)
পিটার গিবসন

11
@ পিটারজিবসন - এই দু'জনের সংমিশ্রণ একটি বৈধ, আরও সীমাবদ্ধ চেক সরবরাহ করবে এবং নিশ্চিত করবে 1) lst পুনরাবৃত্ত হবে, 2) না হয় স্ট্রিং নয়। assert isinstance(lst, (list, tuple)) and assert not isinstance(lst, basestring)
strongMA

4
ঠিক আছে, এই সমাধানটি কেবল স্ট্রিং উদ্ভূত প্রকারের জন্য পরীক্ষা করে, তবে পূর্ণসংখ্যা, ডাবল বা অন্য কোনও পুনরাবৃত্তীয় টাইপের কী?
এনেকো অ্যালোনসো

171

মনে রাখবেন পাইথনে আমরা "হাঁসের টাইপিং" ব্যবহার করতে চাই। সুতরাং, তালিকার মতো কাজ করে এমন যে কোনও কিছুই তালিকা হিসাবে বিবেচনা করা যেতে পারে। সুতরাং, তালিকার ধরণের জন্য যাচাই করবেন না, এটি দেখুন যে এটি কোনও তালিকার মতো কাজ করে কিনা।

তবে স্ট্রিংগুলিও তালিকার মতো কাজ করে এবং প্রায়শই এটি আমরা চাই না। অনেক সময় এমন সমস্যা হয় যখন! সুতরাং, একটি স্ট্রিংয়ের জন্য স্পষ্টভাবে চেক করুন, তবে তারপরে হাঁসের টাইপিং ব্যবহার করুন।

আমি মজাদার জন্য লিখেছি একটি ফাংশন এখানে। এটি এমন একটি বিশেষ সংস্করণ repr()যা কোণ বন্ধনীগুলিতে কোনও ক্রম মুদ্রণ করে ('<', '>')।

def srepr(arg):
    if isinstance(arg, basestring): # Python 3: isinstance(arg, str)
        return repr(arg)
    try:
        return '<' + ", ".join(srepr(x) for x in arg) + '>'
    except TypeError: # catch when for loop fails
        return repr(arg) # not a sequence so just return repr

এটি সামগ্রিকভাবে পরিষ্কার এবং মার্জিত। কিন্তু isinstance()সেখানে চেক কি করছে? এটা হ্যাক ধরনের। তবে এটি অপরিহার্য।

এই ফাংশনটি তালিকার মতো কাজ করে এমন কোনও কিছুর উপরে নিজেকে পুনরাবৃত্তি বলে। আমরা যদি স্ট্রিংটি বিশেষভাবে পরিচালনা না করি, তবে এটি তালিকার মতো বিবেচিত হবে এবং একবারে একটি চরিত্র বিভক্ত হবে। তবে তারপরে পুনরাবৃত্ত কলটি প্রতিটি চরিত্রকে একটি তালিকা হিসাবে বিবেচনা করার চেষ্টা করবে - এবং এটি কার্যকর হবে! এমনকি একটি এক-চরিত্রের স্ট্রিং তালিকা হিসাবে কাজ করে! স্ট্যাক ওভারফ্লো না হওয়া পর্যন্ত ফাংশনটি নিজেকে পুনরাবৃত্তভাবে ডাকে।

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

দ্রষ্টব্য: try/ exceptআমাদের উদ্দেশ্য প্রকাশ করার সবচেয়ে পরিষ্কার উপায়। তবে যদি এই কোডটি কোনওভাবে সময়-সমালোচিত হয় তবে আমরা এটি argকোনও ক্রম কিনা তা দেখার জন্য এটি কোনও পরীক্ষার সাথে এটি প্রতিস্থাপন করতে চাই । প্রকারটি পরীক্ষা করার পরিবর্তে আমাদের সম্ভবত আচরণগুলি পরীক্ষা করা উচিত। যদি এটির কোনও .strip()পদ্ধতি থাকে তবে এটি একটি স্ট্রিং, সুতরাং এটিকে ক্রম হিসাবে বিবেচনা করবেন না; অন্যথায়, যদি এটি সূচকযোগ্য বা পুনরাবৃত্ত হয় তবে এটি একটি ক্রম:

def is_sequence(arg):
    return (not hasattr(arg, "strip") and
            hasattr(arg, "__getitem__") or
            hasattr(arg, "__iter__"))

def srepr(arg):
    if is_sequence(arg):
        return '<' + ", ".join(srepr(x) for x in arg) + '>'
    return repr(arg)

সম্পাদনা: আমি প্রথমে উপরের জন্য একটি চেক দিয়ে লিখেছি __getslice__()কিন্তু আমি লক্ষ্য করেছি যে collectionsমডিউল ডকুমেন্টেশনে, আকর্ষণীয় পদ্ধতিটি __getitem__(); এটি বোঝা যায় যে, আপনি কীভাবে কোনও বিষয়টিকে সূচক করেন। এটি আরও মৌলিক বলে মনে হয় __getslice__()তাই আমি উপরেরটি পরিবর্তন করেছি।


2
@ স্ট্যানটঙ্ক, এটি বলার জন্য আপনাকে ধন্যবাদ, তবে আমি মনে করি যে এটি লেখার সময় ইতিমধ্যে একটি স্বীকৃত উত্তর ছিল এবং আমি সত্যই গৃহীত উত্তরটি পরিবর্তিত হওয়ার প্রত্যাশা করি না।
স্টিভাহ

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

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

1
আমি এই সম্পর্কে কিছুটা ভেবেছি, এবং কয়েক অন্যান্য লোকের সাথে এটি নিয়ে আলোচনা করেছি এবং আমি মনে করি srepr()ঠিক আছে। অন্য তালিকার ভিতরে নেস্টেড তালিকার মতো জিনিসগুলি পরিচালনা করতে আমাদের একটি পুনরাবৃত্ত ফাংশন প্রয়োজন; তবে স্ট্রিংগুলির জন্য আমরা সেগুলি তার "foo"চেয়ে প্রিন্ট করতে চাই <'f', 'o', 'o'>। সুতরাং একটি স্ট্রিং জন্য একটি সুস্পষ্ট চেক এখানে বোধগম্য। এছাড়াও, এমন ডেটা ধরণের প্রকৃতপক্ষে অন্য কোনও উদাহরণ নেই যেখানে পুনরাবৃত্তি সর্বদা একটি পুনরাবৃত্ত হয় এবং পুনরাবৃত্তি সর্বদা স্ট্যাকের ওভারফ্লো করে দেয়, সুতরাং এটির পরীক্ষা করার জন্য আমাদের কোনও বিশেষ সম্পত্তিের প্রয়োজন নেই ("প্রাকটিক্যালিটি বিশুদ্ধতা বীট করে")।
স্টিভাহ

1
এটি পাইথন 3 তে কাজ করে না, কারণ স্ট্রিংগুলির পাইথন 3 তে একটি __iter__()পদ্ধতি রয়েছে তবে পাইথন 2 এ নয় You আপনি এতে প্রথম বন্ধনী অনুপস্থিত রয়েছেন is_sequence(), এটি পড়তে হবে:return (not hasattr(arg, "strip") and (hasattr(arg, "__getitem__") or hasattr(arg, "__iter__")))
MiniQuark

124
H = "Hello"

if type(H) is list or type(H) is tuple:
    ## Do Something.
else
    ## Do Something.

11
এটি যদি হাঁসের টাইপিংয়ের পাইথন আইডিয়ামটি ব্যবহার না করে তবে অন্যান্য মন্তব্যকারীরা উল্লেখ করেছেন (যদিও এটি সরাসরি এবং পরিষ্কারভাবে প্রশ্নের উত্তর দেয়)।
সোরেন বর্জনস্টাড

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

11
"হাঁসের টাইপিংয়ের অনুমতি না দেওয়া" উত্তরটি কোনও কম গ্রহণযোগ্য করে তোলে না, বিশেষত এই উত্তরটি আসলে প্রশ্নের উত্তর দেয়।
পেট্রি

4
আমি এই উত্তরটি অগ্রাহ্য করেছি, তবে if isinstance( H, (list, tuple) ): ...স্বল্প এবং পরিষ্কার।
শাহহার_ম

2
বিকল্প বাক্য গঠন:if type(H) in [list, tuple]:
ftefan শিন্ডলার

77

পাইথন 3 এর জন্য:

import collections.abc

if isinstance(obj, collections.abc.Sequence) and not isinstance(obj, str):
    print("obj is a sequence (list, tuple, etc) but not a string")

সংস্করণ ৩.৩-তে পরিবর্তিত হয়েছে: সংগ্রহ সংগ্রহের বিমূর্ত বেস শ্রেণিগুলি সংগ্রহ.এবসি মডিউলে স্থানান্তরিত। পিছনের সামঞ্জস্যের জন্য, তারা সংস্করণ 3.8 অবধি এই মডিউলে দৃশ্যমান হতে থাকবে যেখানে এটি কাজ করা বন্ধ করবে।

পাইথন 2 এর জন্য:

import collections

if isinstance(obj, collections.Sequence) and not isinstance(obj, basestring):
    print "obj is a sequence (list, tuple, etc) but not a string or unicode"

5
কি দারুন! এটি সত্যিই দুর্দান্তভাবে কাজ করে এবং অন্য সঠিক উত্তরগুলির তুলনায় অনেকটা সুসংহত। আমার কোনও ধারণা ছিল না যে অন্তর্নির্মিত প্রকারগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হয় collections.Sequenceতবে আমি এটি পরীক্ষা করেছি এবং আমি দেখতে পাচ্ছি যে তারা তা করে। তাই করে xrange। আরও ভাল, এই পরীক্ষাটি বাদ দেয় dict, যা উভয়ই __getitem__এবং __iter__
নীল মেহেহে

কোন ধারণা কেন ফলাফল inspect.getmro(list)অন্তর্ভুক্ত করা হয় না Sequence? isinstanceযখন সমস্ত getmroকিছু না দেখায় আমরা কী করতে পারি তা কীভাবে নির্ধারণ করা উচিত ?
স্টিভ জর্জেনসেন

@ স্টিভজর্জেনসেন মেথড রেজোলিউশন অর্ডার ক্লাসে সঠিক পদ্ধতি ব্যবহারের জন্য পাইথন দ্বারা ব্যবহৃত শ্রেণীর অনুসন্ধানের পথটি সংজ্ঞায়িত করেছে। Sequenceএকটি বিমূর্ত শ্রেণি।
সুজনকাশ্য

3
পাইথন 3 এ, আপনি আইসনস্ট্যান্স (ওজেক্ট, বেসস্ট্রিং) কে আইসিনস্ট্যান্স (ওজেক্ট, স্ট্র) দিয়ে প্রতিস্থাপন করতে পারেন এবং এটির কাজ করা উচিত।
এড্রিয়ান কেইস্টার

2
পাইথন 3-তে আপনার প্রয়োজন এবং আইসনস্ট্যান্স নয় (অবজেক্ট, বাইটস) ... যদি আপনি কিছু তালিকার তালিকা চান, এবং কেবল বাইটগুলি গণনা না করে ...
এরিক অ্যারোনস্টি

35

পিএইচপি গন্ধযুক্ত পাইথন:

def is_array(var):
    return isinstance(var, (list, tuple))

6
পাইথন হ'ল হাঁস-টাইপ করা ভাষা, সুতরাং আপনার ভেরিওটির বৈশিষ্ট্য আছে কিনা তা সত্যিই পরীক্ষা করা উচিত __getitem__। এছাড়াও নামটি বিভ্রান্তিকর, কারণ অ্যারে মডিউলটিও রয়েছে। এবং ভেরিও একটি নম্পি.অ্যান্ডারে বা অন্য কোনও ধরণের হতে পারে __getitem__। সঠিক উত্তরের জন্য stackoverflow.com/a/1835259/470560 দেখুন ।
পেটারহিল

9
@ পেটারহিল strএছাড়াও __getitem__আপনার চেক বাদ যায় নাstr
এরিকবওয়ার্ক

9
সুতরাং একটি ডিক্ট না। চেক করা __getitem__এখানে খারাপ পরামর্শ।
পেট্রি

10

সাধারণভাবে বলতে গেলে, কোনও ফাংশন যা কোনও বস্তুর উপরে পুনরাবৃত্তি করে তা স্ট্রিংয়ের পাশাপাশি টিপলস এবং তালিকাগুলিতে কাজ করে যা বাগের চেয়ে বৈশিষ্ট্য বেশি। কোনও যুক্তি যাচাই করতে আপনি অবশ্যই isinstanceহাঁসের টাইপিং ব্যবহার করতে পারেন বা করতে পারেন , তবে কেন আপনার উচিত?

এটি একটি অলৌকিক প্রশ্নের মতো শোনাচ্ছে, তবে তা নয়। "আমি যুক্তির ধরণ কেন পরীক্ষা করব?" এর উত্তর সম্ভবত আসল সমস্যার সমাধান বোঝাতে চলেছে, অনুভূত সমস্যাটি নয় not স্ট্রিংটি ফাংশনে যাওয়ার পরে এটি কেন বাগ হয়? এছাড়াও: যদি কোনও ফাংশনটিতে কোনও স্ট্রিং প্রেরণ করা হয় তবে এটি কোনও বাগ, যদি অন্য কোনও তালিকাবিহীন / টুপল পুনরাবৃত্ত হয় না তবে এটি কি বাগ হয়? কেন অথবা কেন নয়?

আমি মনে করি যে প্রশ্নের সর্বাধিক সাধারণ উত্তর সম্ভবত এটি হতে পারে যে বিকাশকারীরা লিখেন f("abc")ফাংশনটি তারা যেমন লিখেছেন তেমন আচরণ করবে বলে প্রত্যাশা করছেন f(["abc"])। সম্ভবত এমন পরিস্থিতি রয়েছে যেখানে এটি বিকাশকারীদের নিজের থেকে সুরক্ষিত করার চেয়ে আরও বেশি অর্থবোধ তৈরি করে যা স্ট্রিংয়ে অক্ষরগুলি জুড়ে পুনরাবৃত্তি করার ক্ষেত্রে সমর্থন দেয়। তবে আমি প্রথমে এটি সম্পর্কে দীর্ঘ এবং কঠোর চিন্তা করব।


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

8

পাঠযোগ্যতা এবং সর্বোত্তম অনুশীলনের জন্য এটি ব্যবহার করে দেখুন:

Python2

import types
if isinstance(lst, types.ListType) or isinstance(lst, types.TupleType):
    # Do something

Python3

import typing
if isinstance(lst, typing.List) or isinstance(lst, typing.Tuple):
    # Do something

আশা করি এটা সাহায্য করবে.


পাইথন 3.6.5:AttributeError: module 'types' has no attribute 'ListType'
জুহা অন্টিনেন

1
পাইথন 3 এ, এটি হল: from typing import List-> isinstance([1, 2, 3], List= True, এবং isinstance("asd", List)= False
জুহা আনটিনেন

5

strবস্তু একটি নেই __iter__অ্যাট্রিবিউট

>>> hasattr('', '__iter__')
False 

যাতে আপনি একটি চেক করতে পারেন

assert hasattr(x, '__iter__')

এবং এটি AssertionErrorঅন্য যে কোনও অ-পুনরাবৃত্তিযোগ্য অবজেক্টের জন্যও দুর্দান্ত উত্থাপন করবে ।

সম্পাদনা করুন: টিম মন্তব্যগুলিতে যেমন উল্লেখ করেছেন, এটি কেবলমাত্র পাইথন ২.x-এ কাজ করবে, ৩.x নয়


8
যত্নশীল: পাইথন 3 hasattr('','__iter__')রিটার্নে True। আপনি অবশ্যই একটি স্ট্রিং উপর পুনরাবৃত্তি করতে পারেন যেহেতু এবং অবশ্যই এটি বোধগম্য।
টিম পিটজ্যাকার

1
সত্যি? আমি এটা জানতাম না। আমি সবসময়ই ভাবতাম যে এটি সমস্যার মার্জিত সমাধান, ওহ ভাল।
মো

1
পাইওডবিসি.রোতে এই পরীক্ষাটি কার্যকর হয়নি। এর কোনও ইটার নেই __ () তবে এটি কম-বেশি একটি তালিকার মতো আচরণ করে (এটি "__setitem " এমনকি সংজ্ঞায়িত করে )। আপনি এর উপাদানগুলি ঠিকঠাক করতে পারেন। লেন () ফাংশনটি কাজ করে এবং আপনি এর উপাদানগুলি সূচক করতে পারেন। আমি সঠিক সংমিশ্রণটি খুঁজতে লড়াই করে যাচ্ছি যা সমস্ত তালিকার ধরণগুলিতে ধরা পড়ে তবে স্ট্রিংগুলি বাদ দেয়। আমি মনে করি বেসস্ট্রিংকে স্পষ্টভাবে বাদ দিয়ে আমি " গেটাইটেম " এবং " লেন " এ যাচাইয়ের জন্য নিষ্পত্তি করব।
হরিদসভ

5

এটি সরাসরি ওপিকে উত্তর দেওয়ার উদ্দেশ্যে নয়, তবে আমি কিছু সম্পর্কিত ধারণা ভাগ করতে চেয়েছিলাম।

আমি উপরের @ স্টেভেহা উত্তরে খুব আগ্রহী ছিলাম, যা একটি উদাহরণ দিয়েছিল যেখানে হাঁসের টাইপিং ভেঙে যাচ্ছে বলে মনে হচ্ছে। দ্বিতীয় চিন্তাধারার ক্ষেত্রে, তবে তার উদাহরণ থেকে বোঝা যায় যে হাঁসের টাইপিং মেনে চলা শক্ত, তবে এটি কোনও বিশেষ হ্যান্ডলিংয়ের উপযুক্ত বলে মনে হয় নাstr

সর্বোপরি, একটি অ- strটাইপ (উদাহরণস্বরূপ, একটি ব্যবহারকারী-সংজ্ঞায়িত প্রকার যা কিছু জটিল পুনরাবৃত্ত কাঠামো বজায় রাখে) @ স্টেভেহা sreprফাংশনটিকে একটি অসীম পুনরাবৃত্তি ঘটায়। যদিও এটি স্বীকৃত হওয়ার চেয়ে কম সম্ভাব্য, আমরা এই সম্ভাবনাটিকে উপেক্ষা করতে পারি না। অতএব, বরং বিশেষ-আবরণ strমধ্যে srepr, আমরা নির্মল উচিত কি আমরা চাই sreprএকটি অসীম recursion ফলাফল না।

মনে হতে পারে যে একটি যুক্তিসঙ্গত পন্থা হ'ল sreprএই মুহুর্তে কেবল পুনরাবৃত্তিগুলি ভাঙ্গা list(arg) == [arg]। এই, আসলে, সম্পূর্ণরূপে সঙ্গে সমস্যার সমাধান হবে str, কোনো ছাড়া isinstance

তবে, সত্যিই জটিল পুনরাবৃত্তির কাঠামো অসীম লুপের কারণ হতে পারে যেখানে list(arg) == [arg]কখনই ঘটে না। সুতরাং, উপরের চেকটি কার্যকর হলেও এটি পর্যাপ্ত নয়। আমাদের পুনরাবৃত্তির গভীরতায় কঠোর সীমাবদ্ধতার মতো কিছু দরকার।

আমার বক্তব্যটি হ'ল আপনি যদি স্বেচ্ছাসেবী যুক্তির ধরণের হ্যান্ডেলগুলি পরিচালনা করার পরিকল্পনা করেন তবে strহাঁসের টাইপিংয়ের মাধ্যমে পরিচালনা করা আপনার পক্ষে (তাত্ত্বিকভাবে) যে আরও সাধারণ ধরণের মুখোমুখি হতে পারে তার চেয়ে বেশি সহজ। সুতরাং যদি আপনি strউদাহরণগুলি বাদ দেওয়ার প্রয়োজনীয়তা অনুভব করেন , তবে পরিবর্তে আপনার দাবি করা উচিত যে যুক্তিটি আপনি কয়েকটি ধরণের স্পষ্টভাবে নির্দিষ্ট করেছেন one


1
হুম, আপনার ভাবনার পদ্ধতিটি আমি পছন্দ করি। আমি মনে করি আপনি তর্ক করতে পারবেন না যে আমার কোডটি ব্যবহারিক: ঠিক একটি সাধারণ ঘটনা, strবিশেষ ক্ষেত্রের কোডটি পরিচালনা করে। তবে সম্ভবত এমন একটি নতুন স্ট্যান্ডার্ড সম্পত্তি থাকা উচিত যা কোডটি পরিদর্শন করতে পারে, .__atomic__আসুন আমরা বলতে পারি যে এটি কোনও সংকেতকে আরও ভেঙে ফেলা যায় না। atomic()পাইথনে আরও একটি বিল্টিন ফাংশন যুক্ত করতে খুব দেরি হয়ে গেছে , তবে আমরা সম্ভবত from collections import atomicকিছু যোগ করতে পারি।
স্টিভেহা

5

আমি সেন্সরফ্লোতে এই জাতীয় ক্রিয়াকলাপটি পেয়েছি

def is_sequence(seq):
  """Returns a true if its input is a collections.Sequence (except strings).
  Args:
    seq: an input sequence.
  Returns:
    True if the sequence is a not a string and is a collections.Sequence.
  """
  return (isinstance(seq, collections.Sequence)
and not isinstance(seq, six.string_types))

এবং আমি যাচাই করেছি যে এটি আপনার প্রয়োজনগুলি পূরণ করে।


2

আমি আমার টেস্টকেসে এটি করি do

def assertIsIterable(self, item):
    #add types here you don't want to mistake as iterables
    if isinstance(item, basestring): 
        raise AssertionError("type %s is not iterable" % type(item))

    #Fake an iteration.
    try:
        for x in item:
            break;
    except TypeError:
        raise AssertionError("type %s is not iterable" % type(item))

জেনারেটরগুলির সাথে নিরক্ষিত, আমি মনে করি যে কোনও জেনারেটরে পাস করা হলে আপনি পরবর্তী 'ফলন' এ রেখে গেছেন, যা জিনিসগুলি প্রবাহিত করতে পারে। তবে আবার, এটি একটি 'ইউনিটেস্ট'


2

"হাঁসের টাইপিং" পদ্ধতিতে, কীভাবে

try:
    lst = lst + []
except TypeError:
    #it's not a list

অথবা

try:
    lst = lst + ()
except TypeError:
    #it's not a tuple

যথাক্রমে। এটি isinstance/ hasattrঅন্তঃসংশোধন স্টাফ এড়ায়।

আপনি বিপরীতে পরীক্ষা করতে পারেন:

try:
    lst = lst + ''
except TypeError:
    #it's not (base)string

সমস্ত রূপগুলি প্রকৃতপক্ষে ভেরিয়েবলের সামগ্রী পরিবর্তন করে না, তবে একটি পুনরায় নিয়োগের ইঙ্গিত দেয়। আমি নিশ্চিত না যে এটি কিছু পরিস্থিতিতে অনাকাঙ্ক্ষিত হতে পারে।

মজার বিষয় হল, "স্থান" অ্যাসাইনমেন্টের সাথে +=কোনও তালিকাTypeError থাকলে lstকোনও তালিকা উত্থাপিত হবে না (একটি টিউপল নয় )। এজন্য অ্যাসাইনমেন্টটি এভাবে করা হয়। যে কেউ কেন এটি আলোকপাত করতে পারে।


1

সহজ উপায় ... ব্যবহার anyএবংisinstance

>>> console_routers = 'x'
>>> any([isinstance(console_routers, list), isinstance(console_routers, tuple)])
False
>>>
>>> console_routers = ('x',)
>>> any([isinstance(console_routers, list), isinstance(console_routers, tuple)])
True
>>> console_routers = list('x',)
>>> any([isinstance(console_routers, list), isinstance(console_routers, tuple)])
True

1

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

স্ট্রিং-জাতীয় বস্তুর স্ট্রিং প্রতিনিধিত্ব নিজেই স্ট্রিং, তাই আপনি strকনস্ট্রাক্টরের কাছ থেকে কোনও সমান বস্তু ফিরে পেয়েছেন কিনা তা পরীক্ষা করতে পারেন :

# If a string was passed, convert it to a single-element sequence
if var == str(var):
    my_list = [var]

# All other iterables
else: 
    my_list = list(var)

এটি strসমস্ত ধরণের পুনরাবৃত্ত বস্তুর সাথে সামঞ্জস্যপূর্ণ সামগ্রীর জন্য কাজ করা উচিত ।


0

পাইথন 3 এর এটি রয়েছে:

from typing import List

def isit(value):
    return isinstance(value, List)

isit([1, 2, 3])  # True
isit("test")  # False
isit({"Hello": "Mars"})  # False
isit((1, 2))  # False

সুতরাং তালিকাগুলি এবং টিপলস উভয়ের জন্য যাচাই করার জন্য এটি হবে:

from typing import List, Tuple

def isit(value):
    return isinstance(value, List) or isinstance(value, Tuple)

0
assert (type(lst) == list) | (type(lst) == tuple), "Not a valid lst type, cannot be string"

2
এটি কি এটি করার একটি ঠিক উপায়?
এরশ

1
তাই আপনাকে স্বাগতম। এই কোডটি কেন প্রশ্নের উত্তর দেয় তার একটি ব্যাখ্যা সহায়ক হবে।
নিক

হ্যাঁ, আমি এর সাথে অনুরূপ পদ্ধতিগুলি ব্যবহার করি যেহেতু পাইপটিকে একটি হিসাবে বিবেচনা করা হয় বা তাই আপনি দৃ .়ভাবে বলছেন যে টাইপটি অবশ্যই ত্রুটি পরিচালনার জন্য কাস্টম বার্তার ত্রুটিটিকে একটি কাস্টম বার্তা ত্রুটি আউটপুট করতে হবে type আমি বিশ্বাস করি এটি প্রশ্নের উত্তর দেয়, তবে আমি আগ্রহী ছিলাম যেন এটি করার একটি কার্যকর উপায় কারণ আমি এখনও সর্বাধিক অনুকূলিত কোডটি লেখার ঝুল পেতে চেষ্টা করছি। তবে আমি অনিশ্চিত যদি এই কোডটি তালিকাগুলি / tuples এর মতো কাজ করতে পারে এমন কোনও জিনিস বাদ না দেয় তবে কোনওটিরই সাবক্লাস হয় না, যেমন গ্রহণযোগ্য উত্তর কীভাবে সেই সম্ভাবনাটিকে সম্বোধন করে। ধন্যবাদ!
এরশ

-1

শুধু এই কাজ

if type(lst) in (list, tuple):
    # Do stuff

5
isinstance (lst, (তালিকা, tuple))
দেভি লিমা

@ ডেভিলিমা ঠিক আছে, এটি অন্য উপায়। তবে টাইপ () এর জন্য অন্তর্নির্মিত ধরণের এবং ক্লাসগুলির জন্য আইসনস্ট্যান্সের জন্য প্রস্তাবিত।
ATOzTOA

-1

পাইথন> 3.6

import collections
isinstance(set(),collections.abc.Container)
True
isinstance([],collections.abc.Container)
True
isinstance({},collections.abc.Container)
True
isinstance((),collections.abc.Container)
True
isinstance(str,collections.abc.Container)
False

2
শেষ চেক আপনি strস্ট্রিং নয়, একটি টাইপ ব্যবহার করুন । চেষ্টা করুন isinstance('my_string', collections.abc.Container)এবং আপনি দেখতে পাবেন যে এটি ফিরে আসবে True। এটি কারণ পদ্ধতি abc.Containerসরবরাহ করে __contains__, এবং স্ট্রিংগুলি অবশ্যই আছে।
জর্জি

-6

আমি এটি করার প্রবণতা রাখি (যদি সত্যিই সত্যই করতে পারি):

for i in some_var:
   if type(i) == type(list()):
       #do something with a list
   elif type(i) == type(tuple()):
       #do something with a tuple
   elif type(i) == type(str()):
       #here's your string

5
আপনার প্রায় কখনও এটি করা উচিত নয়। আমি যদি some_varএকটি ক্লাসের একটি সাবক্লাসের উদাহরণ হয়ে থাকি তবে কী হবে list()? "কোডের সাথে কিছু করুন" কোডের অধীনে এটি পুরোপুরি কাজ করবে যদিও আপনার কোডটিতে এটি করার কী কোনও ধারণা নেই। এবং আপনাকে খুব কমই একটি তালিকা এবং একটি টিউপলের মধ্যে পার্থক্য সম্পর্কে যত্ন নেওয়া প্রয়োজন। দুঃখিত, -1।
স্টিভেহা

1
লেখার দরকার নেই type(tuple())- tupleকরবে। তালিকার জন্য একই। এছাড়াও, উভয় strএবং unicodeপ্রসারিত basestring, যা আসল স্ট্রিং প্রকার, তাই আপনি তার পরিবর্তে এটি পরীক্ষা করতে চান।
আপনার মোডগুলিকে

@ ডিআর ব্লুডমনি: দুর্ঘটনাজনিত ডাউনওয়েট। ডাউনওয়েটটি সরাতে সক্ষম করতে দয়া করে আপনার উত্তরটি সম্পাদন করুন (তুচ্ছভাবে)।
সাব্রেভল্ফি

সাম্য আমার কাছে ধরণের জন্য অর্থপূর্ণ তুলনা বলে মনে হয় না। আমি পরিচয় জন্য এর পরিবর্তে পরীক্ষা চাই: type(i) is list। এছাড়াও, type(list())কেবল listনিজেই ... অবশেষে, এটি সাবক্লাসগুলির সাথে করুণভাবে কাজ করে না। যদি iবাস্তবে এবং অর্ডারডিক্ট বা কোনও ধরণের নামডটপল থাকে তবে এই কোডটি স্ট্রিং হিসাবে বিবেচনা করবে।
বুকজোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.