** কোয়ার্গসের সাথে অন্য ক্রিয়াকলাপে ** কোয়ার্গসের যুক্তিটি দিন


152

আমি নিম্নলিখিত উদাহরণটি বুঝতে পারি না, বলুন যে আমার এই ফাংশনগুলি রয়েছে:

# python likes
def save(filename, data, **kwargs):
    fo = openX(filename, "w", **kwargs) # <- #1
    fo.write(data)
    fo.close()
# python doesnt like
def save2(filename, data, **kwargs):
    fo = openX(filename, "w", kwargs) # <- #2
    fo.write(data)
    fo.close()

def openX(filename, mode, **kwargs):
    #doing something fancy and returning a file object

কেন # 1 সঠিক সমাধান এবং # 2 ভুলটি? **kwargsমূলত একটি ডিক, তাই আমি যদি ওপেনএক্সে যুক্তিটি পাস করতে চাই তবে আমি মনে করি সঠিক উপায়টি ছাড়া হবে **এবং কেবল ডিকটি দেওয়া হবে । তবে পাইথন স্পষ্টতই দ্বিতীয়টির মতো না এবং আমাকে বলে যে আমি 2 টি আর্গুমেন্টের পরিবর্তে 3 দিয়েছি। তাহলে এর পেছনে কারণ কী?

python 

5
আপনি কেন **argsকোড এ কল করেন তা ভাবছি । এটি সম্ভবত সবচেয়ে খারাপ নাম হিসাবে মানুষ এটির সাথে বিভ্রান্ত করবে*args
জন লা রুই

1
ভাল আমি কখনই * আরগগুলি ব্যবহার করি না, তাই আমি ** আরগস use ব্যবহার করি তবে ভাল আমি এটিকে পরিবর্তন করতে পারি।

উত্তর:


155

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

'**' দ্বারা অভিধানটিকে উপসর্গ করে আপনি অভিধানটি kwargsকীওয়ার্ড আর্গুমেন্টে আনপ্যাক করেন ।

একটি অভিধান (প্রকার dict) হ'ল একক ভেরিয়েবল যা কী-মান যুক্ত করে।

"কীওয়ার্ড আর্গুমেন্টগুলি" কী-মান পদ্ধতি - পরামিতি।

যে কোনও অভিধানে কীওয়ার্ড আর্গুমেন্টকে প্যাক করে **ফাংশন কলের সময়টির সাথে উপসর্গ করেই প্যাক করা যায়।


5
এখন আমি এটি পেতে। আমি ভেবেছিলাম কীওয়ার্ড এবং ডিক একই জিনিস।

13
"ফাংশন কলের সময় কোনও ডিকশনারি ** এর সাথে প্রিকফিক্স করে কীওয়ার্ডগুলিতে প্রসারিত করে।" <- এটি দুর্দান্ত


8
একটি আসল কোড উদাহরণ এই উত্তরটি যথেষ্ট পরিষ্কার করে দেবে।
অরেঞ্জডগ

13

**সিনট্যাক্স একটি অভিধানের মধ্যে সংগ্রহ শব্দ আর্গুমেন্ট পাইথন বলে। save2একটি অ-শব্দ যুক্তি (ক অভিধান বস্তুর) হিসেবে এটি ডাউন ক্ষণস্থায়ী হয়। openXকোন শব্দ আর্গুমেন্ট এইজন্য না, তাই **argsব্যবহার করতে পারেন না। পরিবর্তে এটি তৃতীয় নন-কীওয়ার্ড আর্গুমেন্ট (অভিধান) পাচ্ছে। openXফাংশনটির সংজ্ঞা পরিবর্তনের জন্য এটি ঠিক করতে ।

def openX(filename, mode, kwargs):
    pass

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

@ এক্সএমআরডাব্লু এগুলি একই জিনিস হতে পারে না যেহেতু আপনি কোনও কার্যক্রমে প্যারামিটার হিসাবে অভিধান পাস করতে পারেন। আপনার # 1 ঠিক তখন।
কিথ

8

@ জেক্কোর জবাবটি প্রসারিত করার জন্য নিম্নলিখিতটি একটি উদাহরণ যা আপনাকে পার্থক্য দেখাবে:

def foo(**kwargs):
    for entry in kwargs.items():
        print("Key: {}, value: {}".format(entry[0], entry[1]))

# call using normal keys:
foo(a=1, b=2, c=3)
# call using an unpacked dictionary:
foo(**{"a": 1, "b":2, "c":3})

# call using a dictionary fails because the function will think you are
# giving it a positional argument
foo({"a": 1, "b": 2, "c": 3})
# this yields the same error as any other positional argument
foo(3)
foo("string")

এখানে আপনি দেখতে পাচ্ছেন যে কোনও অভিধান আনপ্যাক করা কীভাবে কাজ করে এবং কেন একটি আসল অভিধান পাঠানো ব্যর্থ হয়


1

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


দুঃখিত তবে "কীওয়ার্ড এক্সপেনশন" কী? আপনার অর্থ কি আমার ** আর্গের পরিবর্তে ডিক_ভার ব্যবহার করা উচিত এবং কেবল ডিফ ফ্যাঙ্ক ব্যবহার করা উচিত (যুক্তি, ডিক্ট_ভার = 0) ... ফানক (1, {1: "এ", 2: "বি"})

1

# 2 এর জন্য আরোগুলি কেবল ডিক মান সহ একটি আনুষ্ঠানিক প্যারামিটার হবে তবে কীওয়ার্ড টাইপের প্যারামিটার নয়।

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

** কিলোওয়াট ব্যবহারের আরও বিশদ জানতে এটি পরীক্ষা করে দেখুন

http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/


সুতরাং ** কাওয়ার্গস এবং ডিকের মধ্যে একটি বড় পার্থক্য আছে?

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