মনে রাখবেন পাইথনে আমরা "হাঁসের টাইপিং" ব্যবহার করতে চাই। সুতরাং, তালিকার মতো কাজ করে এমন যে কোনও কিছুই তালিকা হিসাবে বিবেচনা করা যেতে পারে। সুতরাং, তালিকার ধরণের জন্য যাচাই করবেন না, এটি দেখুন যে এটি কোনও তালিকার মতো কাজ করে কিনা।
তবে স্ট্রিংগুলিও তালিকার মতো কাজ করে এবং প্রায়শই এটি আমরা চাই না। অনেক সময় এমন সমস্যা হয় যখন! সুতরাং, একটি স্ট্রিংয়ের জন্য স্পষ্টভাবে চেক করুন, তবে তারপরে হাঁসের টাইপিং ব্যবহার করুন।
আমি মজাদার জন্য লিখেছি একটি ফাংশন এখানে। এটি এমন একটি বিশেষ সংস্করণ 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__()
তাই আমি উপরেরটি পরিবর্তন করেছি।