ফাংশন আর্গুমেন্ট এয়ার এয়ারস্কিপ?


242

একটি ফাংশনের যুক্তিগুলির মধ্যে খালি নক্ষত্রটি কী করে?

আমি যখন আচারের মডিউলটি দেখি তখন আমি এটি দেখতে পাই:

pickle.dump(obj, file, protocol=None, *, fix_imports=True)

আমি পূর্ববর্তী যুক্তিগুলির (একক এবং দ্বিগুণ অ্যাসিরিস্টস সম্পর্কে আর্গুমেন্টের পরিবর্তনশীল সংখ্যার জন্য) সম্পর্কে জানি, তবে এর আগে কিছুই হয় না। এবং আমি খুব নিশ্চিত যে এটি আচার সঙ্গে কিছু করার নেই। এটি সম্ভবত এই ঘটনার একটি উদাহরণ। আমি এটির নাম কেবল তখনই শিখি যখন আমি এটি দোভাষীর কাছে প্রেরণ করি:

>>> def func(*):
...     pass
...
  File "<stdin>", line 1
SyntaxError: named arguments must follow bare *

যদি এটি গুরুত্বপূর্ণ হয় তবে আমি অজগর 3.3.0 এ আছি।


উত্তর:


221

বেয়ারটি নামকরণকারী *আর্গুমেন্টগুলি ব্যবহার করার জন্য কলারকে বাধ্য করার জন্য ব্যবহৃত হয় - সুতরাং *যখন আপনার কোনও নিম্নলিখিত কীওয়ার্ড আর্গুমেন্ট নেই তখন আপনি আর্গুমেন্ট হিসাবে কোনও ক্রিয়াটি সংজ্ঞায়িত করতে পারবেন না ।

দেখুন এই উত্তর বা পাইথন 3 ডকুমেন্টেশন আরো বিস্তারিত জানার জন্য।


3
নোট করুন যে সমস্ত অবস্থানগত (নামবিহীন) যুক্তি সহ *args, খালি করার আগে অবশ্যই উপস্থিত হবে *
বলপয়েন্টবেন

4
এছাড়াও মনে রাখবেন যে এখানে কোনও প্রতিচ্ছবি রয়েছে, /, যা কেবলমাত্র পজিশনাল -যুক্তিগুলির সমাপ্তি চিহ্নিত করে ( স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / ২৪২৪৩32৩২ / ......... )।
স্টিফেন

2
@ বালপয়েন্টপেন: *এর স্থানে রয়েছে *argsএবং তদ্বিপরীত; তারা স্বাক্ষরে সহাবস্থান করতে পারে না। এ কারণেই তারা বেছে নিয়েছে *; পূর্বে, *argsখাঁটি অবস্থানগত যুক্তিগুলিকে জোর করার একমাত্র উপায় ছিল এবং এটি আর্গুমেন্টের শেষ চিহ্ন চিহ্নিত করেছিল যা অবস্থানগতভাবে পাস করা যেতে পারে (যেহেতু এটি সমস্ত অবশিষ্ট অবস্থানিক যুক্তি সংগ্রহ করে, তারা নিম্নলিখিত নামযুক্ত যুক্তিগুলি পৌঁছাতে পারে)। *মানে একই "অবস্থানগত তর্কগুলি এখানে ছাড়িয়ে যেতে পারে না", তবে নামের অভাবের অর্থ "তবে আমি এগুলিকে মোটেও গ্রহণ করব না, কারণ আমি তাদের রাখার জন্য কোনও জায়গা না দেওয়ার জন্য বেছে নিয়েছি"।
শেডোএ্যাঞ্জার

70

যদিও মূল উত্তরটি পুরোপুরি প্রশ্নের উত্তর দেয়, কেবলমাত্র সম্পর্কিত কিছু তথ্য যোগ করে। একক নক্ষত্রের আচরণ থেকে প্রাপ্ত PEP-3102। সম্পর্কিত বিভাগ উদ্ধৃত:

The second syntactical change is to allow the argument name to
be omitted for a varargs argument. The meaning of this is to
allow for keyword-only arguments for functions that would not
otherwise take a varargs argument:

    def compare(a, b, *, key=None):
        ...

সহজ ইংরেজী ভাষায়, এর অর্থ হ'ল কীটির মানটি পাস করতে আপনাকে স্পষ্টভাবে এটি পাস করতে হবে key="value"


ওহ, এটি বিষয়গুলিকে আরও পরিষ্কার করে তোলে। সুতরাং আসলে একটি আর্গুমেন্ট থাকা * যেমন একটি আর্গুমেন্ট আর্গ * থাকার মতো, তবে যেহেতু আপনি এটির কোনও নাম রাখেন নি, সম্ভবত তার বাকী যুক্তিগুলি কীওয়ার্ড হতে বাধ্য করার জন্য কেবলমাত্র তার অবশিষ্ট অবস্থানগত আর্গুমেন্টটি চুপচাপ গুঁজে দেওয়া ble -কেবল.
স্টিফেন

11
@ স্টেফেন আমিও মূলত ভেবেছিলাম, খালি থাকার প্রভাব *বাকী অবস্থানগত যুক্তিগুলিকে ঝাঁকুনিতে ফেলেছে , তবে এটি তেমন নয়। ফাংশনটি প্রত্যাশার চেয়ে অতিরিক্ত অবস্থানগত তর্কগুলি পাস করা, এই ধরণের একটি ত্রুটি দেয়:foo() takes exactly 1 positional argument (2 given)
অজয় এম

19
def func(*, a, b):
    print(a)
    print(b)

func("gg") # TypeError: func() takes 0 positional arguments but 1 was given
func(a="gg") # TypeError: func() missing 1 required keyword-only argument: 'b'
func(a="aa", b="bb", c="cc") # TypeError: func() got an unexpected keyword argument 'c'
func(a="aa", b="bb", "cc") # SyntaxError: positional argument follows keyword argument
func(a="aa", b="bb") # aa, bb

উপরের উদাহরণ ** kwargs সহ

def func(*, a, b, **kwargs):
    print(a)
    print(b)
    print(kwargs)

func(a="aa",b="bb", c="cc") # aa, bb, {'c': 'cc'}

6

শব্দার্থকভাবে, এর অর্থ এটি অনুসরণ করা যুক্তিগুলি কেবল-কী-ওয়ার্ড, সুতরাং আপনি যদি তার নাম উল্লেখ না করে কোনও যুক্তি সরবরাহ করার চেষ্টা করেন তবে আপনি একটি ত্রুটি পাবেন। উদাহরণ স্বরূপ:

>>> def f(a, *, b):
...     return a + b
...
>>> f(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes 1 positional argument but 2 were given
>>> f(1, b=2)
3

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

উদাহরণস্বরূপ তুলনা করুন sorted(nums, reverse=True)যদি আপনি লিখেন sorted(nums, True)। পরবর্তীকালে খুব কম পঠনযোগ্য হবে, তাই পাইথন বিকাশকারীরা আপনাকে এটি আগের পদ্ধতিতে লেখার জন্য বেছে নিয়েছে।


4

ধরুন আপনার ফাংশন রয়েছে:

def sum(a,key=5):
    return a + key 

আপনি এই ফাংশনটি 2 উপায়ে কল করতে পারেন:

sum(1,2) অথবা sum(1,key=2)

ধরুন আপনি চাইছেন sumকেবল কীওয়ার্ড আর্গুমেন্ট ব্যবহার করে ফাংশনটি ডাকা হবে।

আপনি যোগ *অবস্থানগত আর্গুমেন্ট শেষ উপলক্ষে ফাংশন প্যারামিটার লিস্টে।

সুতরাং ফাংশন হিসাবে সংজ্ঞায়িত:

def sum(a,*,key=5):
    return a + key 

শুধুমাত্র ব্যবহার করে বলা যেতে পারে sum(1,key=2)


-1

আমি খুব সহায়ক ব্যাখ্যা হতে নিম্নলিখিত লিঙ্ক পেয়েছি *, *argsএবং **kwargs:

https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/

মূলত, উপরের উত্তরগুলি ছাড়াও, আমি উপরের সাইট থেকে শিখেছি (ক্রেডিট: https://pythontips.com/author/yasoob008/ ):

প্রথম নীচে নির্ধারিত বিক্ষোভের ক্রিয়াকলাপের সাথে দুটি উদাহরণ রয়েছে, একটি সাথে *argsএবং একটি সাথে**kwargs

def test_args_kwargs(arg1, arg2, arg3):
    print "arg1:", arg1
    print "arg2:", arg2
    print "arg3:", arg3

# first with *args
>>> args = ("two", 3,5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5

# now with **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two","arg1":5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3

সুতরাং *argsআপনাকে গতিবেগে যুক্তিগুলির একটি তালিকা তৈরি করতে দেয় যা তারা খাওয়ানো হয় সেই ক্রমে নেওয়া হবে**kwargs NAMED আর্গুমেন্টগুলি সক্ষম করতে সক্ষম হতে পারে এবং সেই অনুসারে NAME দ্বারা প্রক্রিয়া করা যেতে পারে (তারা যে আদেশে খাওয়ানো হয় তা নির্বিশেষে) ।

সাইটটি অব্যাহত রেখেছে যে যুক্তিগুলির সঠিক ক্রম হওয়া উচিত:

some_func(fargs,*args,**kwargs)

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