ফাংশন রিটার্ন টাইপ এবং আর্গুমেন্টের ধরনগুলি কীভাবে জানবেন?


91

আমি পাইথনের হাঁস-টাইপিং ধারণা সম্পর্কে সচেতন থাকাকালীন আমি মাঝে মাঝে ফাংশনগুলির আর্গুমেন্ট বা ফাংশনের রিটার্ন মানের ধরণের সাথে লড়াই করি।

এখন, আমি যদি নিজেই ফাংশনটি লিখি, তবে আমি প্রকারগুলি জানি। তবে যদি কেউ আমার ফাংশনগুলি ব্যবহার করতে এবং কল করতে চায় তবে কীভাবে তিনি তার প্রকারগুলি জানতে পারবেন? আমি সাধারণত ফাংশনের ডক্ট্রিংয়ে টাইপ তথ্য রাখি (যেমন: "...the id argument should be an integer..."এবং "... the function will return a (string, [integer]) tuple.")

তবে ডকাস্ট্রিংয়ের তথ্যগুলি (এবং এটি একটি কোডার হিসাবে এটি রেখে দেওয়ার জন্য) সত্যিই যেভাবে করা উচিত বলে মনে করা হচ্ছে?

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


4
সংক্ষিপ্ত উত্তর হল হ্যাঁ". দীর্ঘ উত্তরটি "হ্যাঁ, অবশ্যই"। আপনি অনেক পাইথন কোডটি দেখেছেন কিনা আমি জানি না, তবে আপনি সম্ভবত কোন প্যাকেজগুলি ব্যবহার করছেন তা নির্দেশ করার জন্য আপনার সম্ভবত প্রশ্নটি আপডেট করা উচিত যাতে আমরা আপনাকে লাইব্রেরি কোডে কীভাবে কাজগুলি সম্পন্ন করা হয় তা দেখতে কোডের দিকে নির্দেশ দিতে পারি you আসলে এখনই ব্যবহার করছি।
এসলট

@ এস.লোট: আমি বর্তমানে মেকানিকাইজ প্যাকেজ নিয়ে লড়াই করছি, তবে আমার ধারণা এটি ঠিক (দুর্ভাগ্যক্রমে) খারাপ নথিভুক্ত।
রবিডিস্কি

6
পাইথনের দুর্দান্ত কারণ আপনি দ্রুত কোড প্রচুর লিখতে পারেন এবং আপনাকে ফেরার ধরণ, যুক্তির ধরণ, রানটাইম পারফরম্যান্স, পরবর্তী দশ বছরের জন্য আপনার স্প্যাগেটি কোড ব্যবহার করতে হবে এবং বজায় রাখতে হবে এমন লোকের মতো জাগতিক জিনিসগুলি নিয়ে আপনাকে চিন্তা করতে হবে না don't ।
জারোমড

উত্তর:


128

২০১১ সাল থেকে জিনিসগুলি কিছুটা বদলেছে! পাইথন 3.5.৩ এ এখন টাইপ করার ইঙ্গিত রয়েছে যা আপনি আর্গুমেন্টগুলি টিকিয়ে দিতে এবং আপনার ফাংশনের ধরণটি ফেরত দিতে পারেন। উদাহরণস্বরূপ:

def greeting(name):
  return 'Hello, {}'.format(name)

এখন এই হিসাবে লেখা যেতে পারে:

def greeting(name: str) -> str:
  return 'Hello, {}'.format(name)

আপনি এখন প্রকারগুলি দেখতে পাচ্ছেন, এখানে কিছু ধরণের alচ্ছিক স্ট্যাটিক ধরণের চেকিং রয়েছে যা আপনাকে এবং আপনার টাইপ পরীক্ষককে আপনার কোড অনুসন্ধান করতে সহায়তা করবে।

আরও ব্যাখ্যার জন্য আমি পাইচর্ম ব্লগে টাইপ ইঙ্গিতগুলিতে ব্লগ পোস্টটি একবার দেখার পরামর্শ দিই


নোট করুন যে পাইথন ২.7 এর জন্য এখানে একই পিইপি -৪৪৪৮ তে একটি টাইপ হিন্টিং সিনট্যাক্স প্রস্তাবিত হয়েছিল । এবং এটি পাইচার্মে কাজ করে, কমপক্ষে v 2017.3 থেকে।
viddik13

4
ঠিক একই সংজ্ঞা সহ গ্রিটিং ফাংশন যদি কোনও প্রকারের প্রকারের বস্তুকে ফিরে দেয় তবে কোনও ত্রুটি বাড়বে না। সুতরাং আপনি এই ধরনের প্রকারের পরীক্ষা করে কীভাবে বোঝাবেন যদি আপনি স্পষ্টভাবে রিটার্নের ধরণ উল্লেখ করেন তবে নিয়মটি মানেন না এবং বিভিন্ন ধরণের অবজেক্টটি ফেরত দেন না?
আরশসিহ

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

এটি কি কম্পিউটারের চেয়ে দ্রুত?
ব্রাইস ওয়েইন

18

ডায়নামিক ভাষাগুলি এভাবে কাজ করে। যদিও এটি সর্বদা ভাল জিনিস নয়, বিশেষত যদি ডকুমেন্টেশনগুলি দুর্বল হয় - কেউ খুব খারাপভাবে নথিভুক্ত অজগর কাঠামোটি ব্যবহার করার চেষ্টা করেছিল? কখনও কখনও উত্সটি পড়তে আপনাকে ফিরে যেতে হবে।

হাঁসের টাইপিংয়ের সমস্যা এড়াতে এখানে কয়েকটি কৌশল দেওয়া হয়েছে:

  • আপনার সমস্যা ডোমেনের জন্য একটি ভাষা তৈরি করুন
  • এটি আপনাকে জিনিসপত্রের নামকরণ করতে সহায়তা করবে
  • আপনার ডোমেন ভাষায় ধারণাগুলি উপস্থাপন করতে প্রকারগুলি ব্যবহার করুন
  • ডোমেন ভাষার শব্দভাণ্ডার ব্যবহার করে নাম ফাংশন পরামিতি

এছাড়াও, একটি গুরুত্বপূর্ণ পয়েন্ট:

  • যতটা সম্ভব স্থানীয় তথ্য রাখুন!

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

সম্পর্কিত, (এবং ডকাস্ট্রিংগুলির সাথেও সম্পর্কিত), পাইথন নামে একটি প্রযুক্তি রয়েছে doctests। আপনার পদ্ধতিগুলি কীভাবে ব্যবহার করা হবে আশা করা যায় তা ডকুমেন্ট করতে এটি ব্যবহার করুন - এবং একই সাথে দুর্দান্ত ইউনিট পরীক্ষার কভারেজ রয়েছে!


4
নম্পি ডকুমেন্টেশন উপরের উত্তরে বর্ণিত দর্শনের একটি ভাল প্রতিনিধি উদাহরণ।
জেরি অজয় ​​19

7

আমি একটি কোর্স কোর্সে অংশ নিয়েছি, এখানে পাঠ ছিল যা আমাদের ডিজাইনের রেসিপি সম্পর্কে শেখানো হয়েছিল।

ডকস্ট্রিং ফর্ম্যাটের নীচে আমি প্রাকটিটিকে দরকারী বলে মনে করি।

Def অঞ্চল (বেস, উচ্চতা):
    '' '(সংখ্যা, সংখ্যা) -> নম্বর # ** টাইপ কনট্র্যাক্ট **
    মাত্রা বেসের সাথে একটি ট্রিংয়ের ক্ষেত্রটি ফেরান # ** বিবরণ **
    এবং উচ্চতা

    >>> এলাকা (10,5) # ** উদাহরণ **
    25.0
    >> এলাকা (2.5,3)
    3.75
    '' '
    রিটার্ন (বেস * উচ্চতা) / 2 

আমি মনে করি যদি ডকাস্ট্রিংগুলি এইভাবে লেখা হয় তবে এটি বিকাশকারীদের অনেকখানি সহায়তা করতে পারে।

ভিডিওতে লিঙ্ক [ভিডিওটি দেখুন] : https://www.youtube.com/watch?v=QAPg6Vb_LgI


5

হ্যাঁ, আপনার ক্লাস এবং ফাংশনগুলিকে অন্যান্য প্রোগ্রামারগুলির সাথে আরও বন্ধুত্বপূর্ণ করতে আপনার ডকাস্ট্রিংগুলি ব্যবহার করা উচিত:

আরও: http://www.python.org/dev/peps/pep-0257/# what-is-a-docstring

কিছু সম্পাদক আপনাকে টাইপ করার সময় ডকাস্ট্রিংগুলি দেখতে দেয়, সুতরাং এটি সত্যিই কাজটিকে আরও সহজ করে তোলে।


+1: এটি নথিভুক্ত করুন, এটি একমাত্র বুদ্ধিমান উপায় এবং এটি স্ট্যাটিকালি টাইপ করা ভাষাগুলির ক্ষেত্রেও। রিটার্নের ধরণগুলি পুরো ছবির একটি তুচ্ছ ভগ্নাংশ।
স্পষ্টভাবে

আমি আমার টাইপগুলি আপনাকে অনেক ধন্যবাদ চাই। ডকুমেন্টেশন + প্রকারের = স্বর্গ
মাস্ম 64

2

হ্যাঁ তাই হয়।

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

একইভাবে, প্যারামিটারগুলি সবসময় একই ধরণের হতে হবে না।


1

উদাহরণস্বরূপ: ডক্ট্রিংয়ে সংক্ষিপ্তভাবে কীভাবে বর্ণনা করতে হবে যে ফাংশনটি ফর্মের প্রতিটি টিপল (নোড_আইড, নোড_নাম, আপটাইম_মিনুট) সহ টিপলগুলির একটি তালিকা ফেরত দেয় এবং উপাদানগুলি যথাক্রমে একটি স্ট্রিং, স্ট্রিং এবং পূর্ণসংখ্যা হয়?

উম ... এর কোনও "সংক্ষিপ্ত" বিবরণ নেই। এটা জটিল। আপনি এটি জটিল হতে ডিজাইন করেছেন। এবং এটির জন্য ডকস্ট্রিংয়ে জটিল ডকুমেন্টেশন প্রয়োজন।

দুঃখিত, তবে জটিলতা - ভাল - জটিল।


4
ঠিক আছে. অফ-টপিক (সাজান অফ): তবে ক্লিনার ডিজাইন কী হবে? ক্লাস?
রবিডিস্কি

@ র্যাব ডিসিঙ্কি: অগত্যা নয়। জটিলতা এখানে অপ্রয়োজনীয় মনে হচ্ছে। সংক্ষিপ্ততা সর্বদা অর্জনযোগ্য বা এমনকি পছন্দসই নয়।
এসলট

4
এই জাতীয় জিনিসটি নথিভুক্ত করার একটি সুস্পষ্ট উপায় হ'ল জাভা জেনেরিকের অনুরূপ কিছু ব্যবহার করা: লিস্ট <টিপল <<, int, ইন >> >>। তবে এটি পাইথন উপায় নয়, আরও ভাল বা আরও খারাপের জন্য।
স্কাইলার


0

ডকাস্ট্রিংস (এবং সাধারণভাবে ডকুমেন্টেশন)। পাইথন 3 পিইপি 3107-তে বর্ণিত হিসাবে ফাংশন টীকা (alচ্ছিক) উপস্থাপন করে (তবে ডকাস্ট্রিংগুলি ছেড়ে দেবে না)

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