পাইথনে ওভারলোডেড ফাংশন?


91

পাইথনে ওভারলোডেড ফাংশনগুলি রাখা কি সম্ভব? সি # তে আমি এমন কিছু করব

void myfunction (int first, string second)
{
//some code
}
void myfunction (int first, string second , float third)
{
//some different code
}

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


এটি একটি সম্ভাব্য সদৃশ পোস্ট বলে মনে হচ্ছে। এছাড়াও প্রশ্নটি সি # এর সাথে সম্পর্কিত নয় বলে দয়া করে সি # হিসাবে পতাকা বদ্ধ করবেন না। অজগর-নিখোঁজ ফাংশন-ওভারলোডিং
জেথ্রো


উত্তর:


103

সম্পাদনা পাইথন ৩.৪-তে নতুন একক প্রেরণের জেনেরিক ফাংশনগুলির জন্য, http://www.python.org/dev/peps/pep-0443/ দেখুন

পাইথনে আপনাকে সাধারণত ওভারলোড ফাংশন করতে হবে না। পাইথনটি গতিশীলভাবে টাইপ করা হয় এবং ফাংশনে alচ্ছিক যুক্তিগুলি সমর্থন করে।

def myfunction(first, second, third = None):
    if third is None:
        #just use first and second
    else:
        #use all three

myfunction(1, 2) # third will be None, so enter the 'if' clause
myfunction(3, 4, 5) # third isn't None, it's 5, so enter the 'else' clause

4
তবে মনে রাখবেন যে আর্গুমেন্টের ধরণের ভিত্তিতে বিভিন্ন ফাংশন কল করা আরও বেশি কঠিন (যদিও অসম্ভব নয়)।
অ্যান্ড্রু জাফি

9
ওয়েল, ওভারলোডিং / পলিমারফিজম এবং শর্তসাপেক্ষের মধ্যে পার্থক্য রয়েছে। আপনার কি শর্ত আছে যেহেতু আমাদের পলিমারফিজমের দরকার নেই?
Val,

4
@ ভ্যাল আমি বলছি, মূলত, গতিশীল টাইপিত ভাষায় আপনার ভাষা বৈশিষ্ট্য হিসাবে অতিরিক্ত বোঝা লাগার দরকার নেই কারণ আপনি এটিকে কোডে তুচ্ছভাবে অনুকরণ করতে পারেন, এবং সেইভাবে পলিমারফিজম পেতে পারেন।
agf

4
@ ওয়াল আমি বলছি যে পাইথনে যেমন alচ্ছিক যুক্তি এবং গতিশীল ধরণের মধ্যে আপনি পলিমারফিজম অর্জন করতে জাভা শৈলী পদ্ধতি ওভারলোডিংয়ের প্রয়োজন নেই।
agf

4
@ নাভিদু আমি যুক্তি দেব যে এটি একটি ভাল ধারণা নয় - একটি ফাংশন পুরোপুরি বিভিন্ন ধরণের জিনিস ফেরত দেয় না। তবে আপনি সর্বদা স্থানীয় ফাংশনের ভিতরে স্থানীয় জেনারেটরের ক্রিয়াকলাপ সংজ্ঞায়িত করতে পারেন, কল করতে পারেন এবং ফলস্বরূপ জেনারেটরটি ফিরিয়ে দিতে পারেন - বাইরে থেকে এটি একই রকম হবে যদি মূল ফাংশনটি কোনও জেনারেটর ছিল। উদাহরণ এখানে।
agf

50

সাধারণ পাইথনে আপনি যা চান তা করতে পারবেন না। দুটি কাছাকাছি কাছাকাছি রয়েছে:

def myfunction(first, second, *args):
    # args is a tuple of extra arguments

def myfunction(first, second, third=None):
    # third is optional

তবে, আপনি যদি সত্যিই এটি করতে চান তবে অবশ্যই আপনি এটি কার্যকর করতে পারেন (সনাতনবাদীদের আপত্তি করার ঝুঁকিতে; ও)। সংক্ষেপে, আপনি একটি wrapper(*args)ফাংশন লিখবেন যা যথাযথ হিসাবে যুক্তি এবং প্রতিনিধিদের সংখ্যা পরীক্ষা করে। এই ধরণের "হ্যাক" সাধারণত সাজসজ্জার মাধ্যমে করা হয়। এই ক্ষেত্রে আপনি যেমন কিছু অর্জন করতে পারেন:

from typing import overload

@overload
def myfunction(first):
    ....

@myfunction.overload
def myfunction(first, second):
    ....

@myfunction.overload
def myfunction(first, second, third):
    ....

এবং আপনি উপার্জন দ্বারা এই বাস্তবায়ন চাই overload(first_fn) ফাংশন (অথবা কন্সট্রাকটর) একটি callable বস্তুর যেখানে আসতে __call__(*args) পদ্ধতি প্রতিনিধিদল উপরে বর্ণিত এবং না overload(another_fn) পদ্ধতি অতিরিক্ত ফাংশন যে অর্পণ করা যেতে পারে যোগ করা হয়েছে।

আপনি এখানে http://acooke.org/pytyp/pytyp.spec.dispatch.html অনুরূপ কিছু উদাহরণ দেখতে পাচ্ছেন তবে এটি টাইপ অনুসারে ওভারলোডিং পদ্ধতি। এটি একটি খুব অনুরূপ পদ্ধতির ...

আপডেট: এবং অনুরূপ কিছু (যুক্তির ধরণগুলি ব্যবহার করে) অজগর 3 -তে যুক্ত করা হচ্ছে - http://www.python.org/dev/peps/pep-0443/


rangeBuiltin জমিদার ব্যবহার করে, তাই এটা সত্যিই একটি হ্যাক হয়? github.com/python/tyypehed/blob/master/stdlib/2and3/…
সিটিপিওরো

9

হ্যাঁ এটা সম্ভব. আমি পাইথন ৩.২.১ তে নীচে কোড লিখেছি:

def overload(*functions):
    return lambda *args, **kwargs: functions[len(args)](*args, **kwargs)

ব্যবহার:

myfunction=overload(no_arg_func, one_arg_func, two_arg_func)

নোট করুন যে overloadফাংশনগুলি দ্বারা ফিরে আসা ল্যাম্বদা নামবিহীন আর্গুমেন্টের উপর নির্ভর করে কল করতে ফাংশনটি চয়ন করে ।

সমাধানটি নিখুঁত নয়, তবে এই মুহুর্তে আমি আরও ভাল কিছু লিখতে পারি না।


1

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

পাইথন গতিশীল। যদি কোনও বিষয় কী করতে পারে সে সম্পর্কে আপনি যদি অনিশ্চিত হন তবে চেষ্টা করুন: এবং এটিতে একটি পদ্ধতি কল করুন, তবে ব্যতীত: ত্রুটি।

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


4
আমি মনে করি না তিনি optionচ্ছিক যুক্তি সম্পর্কে জানতেন।
agf

0

অজস্র পদ্ধতিতে ওভারলোডিং জটিল। তবে ডিক, তালিকা বা আদিম ভেরিয়েবলগুলি পাস করার ব্যবহার থাকতে পারে।

আমি আমার ব্যবহারের ক্ষেত্রে কিছু চেষ্টা করেছি, এটি পদ্ধতিগুলি ওভারলোড করার জন্য লোকদের বুঝতে এখানে সহায়তা করতে পারে।

আসুন স্ট্যাকওভারফ্লো থ্রেডের একটিতে উদাহরণ ব্যবহার করা যাক:

ক্লাস ওভারলোড পদ্ধতি সহ বিভিন্ন শ্রেণীর কল পদ্ধতিগুলি call

def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):

রিমোট ক্লাস থেকে আর্গুমেন্ট পাস:

add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},accelaration=10.6}

বা add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},speed=['10','20,'30']}

সুতরাং, পদ্ধতি ওভারলোডিং থেকে তালিকা, অভিধান বা আদিম ভেরিয়েবলের জন্য হ্যান্ডলিং অর্জন করা হচ্ছে।

আপনার কোডগুলির জন্য এটি ব্যবহার করে দেখুন

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