পাইথনে টাইপ ইঙ্গিত সহ ডিফল্ট প্যারামিটার মান যুক্ত করা হচ্ছে


235

আমার যদি এর মতো কোনও ফাংশন থাকে:

def foo(name, opts={}):
  pass

এবং আমি পরামিতিগুলিতে প্রকারের ইঙ্গিতগুলি যুক্ত করতে চাই, আমি এটি কীভাবে করব? আমি যেভাবে ধরে নিয়েছিলাম তা আমাকে একটি সিনট্যাক্স ত্রুটি দেয়:

def foo(name: str, opts={}: dict) -> str:
  pass

নিম্নলিখিতটি একটি সিনট্যাক্স ত্রুটি ফেলে না তবে এই কেসটি হ্যান্ডেল করার মতো স্বজ্ঞাত উপায় বলে মনে হচ্ছে না:

def foo(name: str, opts: dict={}) -> str:
  pass

typingডকুমেন্টেশনে বা গুগল অনুসন্ধানে আমি কিছুই খুঁজে পাচ্ছি না ।

সম্পাদনা: পাইথনে ডিফল্ট যুক্তিগুলি কীভাবে কাজ করেছিল তা আমি জানতাম না, তবে এই প্রশ্নের খাতিরে আমি উদাহরণগুলি উপরে রাখব। সাধারণভাবে নিম্নলিখিতগুলি করা আরও ভাল:

def foo(name: str, opts: dict=None) -> str:
  if not opts:
    opts={}
  pass

4
শেষ ফাংশনটি সঠিক উপায়। scalaভাষাও এটি একইভাবে করে।
ইস্রায়েল আনটারম্যান

14
আপনি যদি একটি চপল ডিফল্ট প্রকার আছে - যে সমস্যার হতে হবে
noɥʇʎԀʎzɐɹƆ

আমার আপডেটের উত্তরটি দেখুন, @ জোশ
noɥʇʎԀʎzɐɹƆ

@ noɥʇʎԀʎzɐɹƆ আপনি এটির জন্য ব্যবহার না করেই না, উদাহরণস্বরূপ স্মৃতি। : পি
মতিন উলহাক

উত্তর:


280

আপনার দ্বিতীয় উপায়টি সঠিক।

def foo(opts: dict = {}):
    pass

print(foo.__annotations__)

এই ফলাফল

{'opts': <class 'dict'>}

এটি সত্য যে এটি পিইপি 484 এ তালিকাভুক্ত নয় , তবে টাইপ ইঙ্গিতগুলি ফাংশন টীকাগুলির একটি অ্যাপ্লিকেশন, যা পিইপি 3107 নথিভুক্ত । সিনট্যাক্স বিভাগটি পরিষ্কার করে দেয় যে কীওয়ার্ড আর্গুমেন্টগুলি এইভাবে ফাংশন টীকাতে কাজ করে।

আমি পরিবর্তনীয় কীওয়ার্ড আর্গুমেন্ট ব্যবহারের বিরুদ্ধে দৃ strongly়ভাবে পরামর্শ দিচ্ছি। আরও তথ্য এখানে


1
লিগ্যাসি.পাইথন.আর.দেব / পেপস / পেপ ৩৩০/ /# সান্ট্যাক্স দেখুন । টাইপ ইঙ্গিতটি হ'ল ফাংশন টীকাগুলির একটি প্রয়োগ।
চিপনার

@ চেপার সত্য কীড আর্গুমেন্ট সম্পর্কে পিইপি 3107 এর কিছু আছে তা জানতাম না।
noɥʇʎԀʎzɐɹƆ

2
বাহ, পাইথনে পরিবর্তিত ডিফল্ট আর্গুমেন্টগুলি সম্পর্কে আমি জানতাম না ... বিশেষত জাভাস্ক্রিপ্ট / রুবি থেকে আসা যেখানে ডিফল্ট আর্গুমেন্টগুলি ভিন্নভাবে কাজ করে। ইতিমধ্যে যা বলা হয়েছে তা সম্পর্কে পুনরায় বিরতি দেওয়া হবে না, এটি সম্পর্কে আমাকে বিট করার আগে আমি খুব খুশি হয়েছি। ধন্যবাদ!
জোশ

6
আমাকে সর্বদা পরামর্শ দেওয়া হয়েছিল যে {} বা [] এর মতো কোনও মিউটেবল টাইপ বা ডিফল্ট অবজেক্টের পরিবর্তে ডিপ-অনুলিপি ছাড়াই object বস্তুর রূপান্তর পুনরাবৃত্তির মধ্যে অবিরত থাকবে।
মিঃমিজিস

2
পরিবর্তনীয় কীওয়ার্ড আর্গুমেন্টের সাথে পর্যাপ্ত ফাংশনগুলি সংজ্ঞায়িত করুন এবং আপনার জীবনের পছন্দগুলি সম্পর্কে 4 ঘন্টা ডিবাগিং সেশনে নিজেকে ফিরে তাকানোর আগে এটি কেবল সময়ের বিষয়
জোসেফ শেডি

20

আপনি যদি টাইপিং ব্যবহার করছেন (পাইথন ৩.৩ এ প্রবর্তিত) আপনি ব্যবহার করতে পারেন typing.Optionalযেখানে Optional[X]সমান Union[X, None]। এটির সিগন্যাল করতে ব্যবহার করা হয় যে এর সুস্পষ্ট মান Noneঅনুমোদিত। টাইপিং থেকে .চ্ছিক :

def foo(arg: Optional[int] = None) -> None:
    ...

2
আশেপাশে কাউকেই হোয়াইটস্পেস হবে না উচিত =মধ্যে Optional[int] = Noneমত অ-টাইপ-hinted শব্দ আর্গুমেন্ট জন্য সম্মেলন হল?
প্রকৃত_পান্ডা

7

আমি সম্প্রতি এই ওয়ান-লাইনারটি দেখেছি:

def foo(name: str, opts: dict=None) -> str:
    opts = {} if not opts else opts
    pass

হাই কিরকালিউলস, আপনার উত্তরের জন্য ধন্যবাদ আপনি এটি ব্যাখ্যা করতে পারেন কিভাবে এটি কাজ করে?
নাথান

1
ডিফল্ট প্যারামিটার হিসাবে খালি ডিকটি পাস করা প্রতিটি কলের জন্য একই ডিক। সুতরাং যদি ফাংশন এটিকে পরিবর্তন করে তবে পরের বারের ডিফল্টটি হ'ল শেষ সময় থেকে পরিবর্তিত মান। মেকিং Noneডিফল্ট এবং তারপর চেক ভিতরে পদ্ধতি একটি নতুন অভি প্রতিটি সময় পদ্ধতি প্রার্থনা করা হয় বণ্টন করে আপনি এই সমস্যার এড়াতে।
আয়ান গোল্ডবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.