Optionচ্ছিক যুক্তি দিয়ে আমি কীভাবে পাইথন ফাংশন তৈরি করব?


218

আমার একটি পাইথন ফাংশন রয়েছে যা বেশ কয়েকটি যুক্তি দেয়। এর মধ্যে কিছু যুক্তি কিছু পরিস্থিতিতে বাদ দেওয়া যেতে পারে।

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
    #code

আর্গুমেন্টগুলির dমাধ্যমে hস্ট্রিংগুলি রয়েছে যার প্রতিটিটির আলাদা অর্থ রয়েছে। এটি গুরুত্বপূর্ণ যে আমি কোনও সংমিশ্রণে কোন alচ্ছিক পরামিতিগুলি পাস করতে পারি তা চয়ন করতে পারি। উদাহরণস্বরূপ, (a, b, C, d, e)বা (a, b, C, g, h), বা (a, b, C, d, e, f, বা তাদের সমস্ত (এগুলি আমার পছন্দ)।

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

এই মুহূর্তে আমি স্থানধারক হিসাবে প্রথম কয়েকটি অনুপস্থিত যুক্তিগুলির জায়গায় খালি স্ট্রিং প্রেরণ করছি। আমি কেবল আসল মান ব্যবহার করে একটি ফাংশন কল করতে সক্ষম হতে চাই।

এই কাজ করতে কোন উপায় আছে কি? আমি কি যুক্তি তালিকার পরিবর্তে একটি তালিকা পাস করতে পারি?

এই মুহুর্তে সিটিপস ব্যবহার করে প্রোটোটাইপটি দেখতে এমন কিছু দেখাচ্ছে:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]

উত্তর:


194

মত কল করার চেষ্টা করুন: obj.some_function( '1', 2, '3', g="foo", h="bar" )। প্রয়োজনীয় অবস্থানগত যুক্তির পরে, আপনি নাম দ্বারা নির্দিষ্ট alচ্ছিক আর্গুমেন্ট নির্দিষ্ট করতে পারেন।


246

কেবলমাত্র *argsপ্যারামিটারটি ব্যবহার করুন , যা আপনার পরে যতগুলি আর্গুমেন্ট চান তা পাস করতে দেয় a,b,c। আপনাকে মানচিত্রে args> কিছু যুক্তি যুক্ত করতে হবে c,d,e,fতবে এটি ওভারলোডিংয়ের একটি "উপায়"।

def myfunc(a,b, *args, **kwargs):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

এবং এটি এর মান মুদ্রণ করবে c,d,e,f


একইভাবে আপনি kwargsযুক্তিটি ব্যবহার করতে পারেন এবং তারপরে আপনি নিজের পরামিতিগুলির নাম দিতে পারেন ।

def myfunc(a,b, *args, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      #etc
myfunc(a,b, c='nick', d='dog', ...)

এবং তারপরে kwargsসমস্ত পরামিতিগুলির একটি অভিধান থাকবে যা পরে মূল্যবানa,b


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

12
এটিকে
সালিসী

@ নিক্স, আমি আপনার উত্তরটি সত্যিই পছন্দ করি। যাইহোক, আপনি কি বিবৃতিটির c = kwargs.get('c', None)জন্য ব্যবহার করা হয়েছে তা পরিষ্কার করে বলতে পারেন ? Itচ্ছিক আরোগুলি রয়েছে এমন প্রতিটি কার্যক্রমে কি এটি প্রয়োজন? আপনার কোডে আপনার কাছে কেবল 2 টি alচ্ছিক আরোগুলি ছিল। যদি ব্যবহারকারী অন্য আরগ বলতে চায় e? আমি ঐচ্ছিক args কোন অজানা নম্বর জন্য আপনার নমুনা কোড কিভাবে পরিবর্তন করতে পারেন, প্রাক্তন জন্য: def my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...)? c = kwargs.get('c', None) etcকাজটি করার আগে আমাকে কি অন্তর্ভুক্ত করতে হবে obj.add(c, d, ...)?
নিমো

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