** কাওয়ার্গসের কোনও কী বিদ্যমান কিনা তা কীভাবে পরীক্ষা করবেন?


111

পাইথন ৩.২.৩। এখানে কিছু ধারণাগুলি তালিকাভুক্ত ছিল , যা নিয়মিত ভার্সে কাজ করে তবে মনে হয় যে ** কাওয়ারগুলি বিভিন্ন বিধি দ্বারা খেলে ... সুতরাং কেন এই কাজ হয় না এবং আমি কীভাবে ** কাওয়ার্গের কোনও কী বিদ্যমান কিনা তা খতিয়ে দেখতে পারি?

if kwargs['errormessage']:
    print("It exists")

আমিও মনে করি এটি কাজ করা উচিত, তবে এটি হয় না -

if errormessage in kwargs:
    print("yeah it's here")

আমি অনুমান করছি কারণ কাওয়ারগুলি পুনরাবৃত্তিযোগ্য? একটি নির্দিষ্ট কী আছে কিনা তা খতিয়ে দেখতে কি আমাকে পুনরুক্তি করতে হবে?


4
কোন বিশেষ বিধি নেই। আপনি শুধু উদ্ধৃতি ভুলে গেছেন।
লেনার্ট রেজেব্রো

উত্তর:


163

তুমি চাও

if 'errormessage' in kwargs:
    print("found it")

এর মান পেতে errormessage

if 'errormessage' in kwargs:
    print("errormessage equals " + kwargs.get("errormessage"))

এইভাবে, kwargsঅন্য এক dict। আপনার প্রথম উদাহরণটির if kwargs['errormessage']অর্থ, "কাওয়ার্গসের" ত্রুটিযুক্ত "কীটির সাথে সম্পর্কিত মানটি পান এবং তার মূল মানটি পরীক্ষা করুন"। সুতরাং যদি এরকম কোনও কী না থাকে তবে আপনি একটি পাবেন KeyError

আপনার দ্বিতীয় উদাহরণটির if errormessage in kwargs:অর্থ, "যদি kwargs" errormessage" দ্বারা চিহ্নিত উপাদানটি থাকে " এবং যদি " errormessage" কোনও ভেরিয়েবলের নাম না হয় তবে আপনি একটি পাবেন NameError

আমার উল্লেখ করা উচিত যে .get()অভিধানগুলিতে একটি পদ্ধতিও রয়েছে যা একটি ডিফল্ট প্যারামিটার গ্রহণ করে (নিজেই এটি ডিফল্ট হয় None), যাতে kwargs.get("errormessage")সেই কীটি উপস্থিত থাকলে মানটি দেয় এবং Noneঅন্যথায় (একইভাবে kwargs.get("errormessage", 17)আপনি যা ভাবতে পারেন তা এটি করে)। যখন আপনি কীটি বিদ্যমান এবং Noneমান হিসাবে থাকা বা কীটি বিদ্যমান নেই তার মধ্যে পার্থক্য সম্পর্কে চিন্তা করবেন না , তখন এটি কার্যকর হতে পারে।


অতিরিক্ত ব্যাখ্যার জন্য ধন্যবাদ! অজগর আগতদের জন্য কিছু পটভূমি তথ্য এবং কী কী সম্ভব এবং কী নয় তার আরও উদাহরণ পেতে সর্বদা ভাল। সেই আত্মায়: আমি মনে করি, kwargs.get("errormessage", 17)এর মান ফিরিয়ে দিতে পারে বা 17ত্রুটি-বিচ্যুতি উপস্থিত না থাকলে - তবে আমি নিশ্চিত নই। এটা কি ঠিক?
হানিবার

আহ্ হ্যাঁ তা করে। এটি এখানে খুঁজে পেয়েছি । ধন্যবাদ ... শুধু নিশ্চিত হতে চেয়েছিলেন
হানিবার

21

ডিএসএম এবং টেডেকের উত্তরগুলি সরাসরি আপনার প্রশ্নের উত্তর দেয়।

আমার স্ক্রিপ্টগুলিতে আমি প্রায়শই alচ্ছিক dict.pop()এবং অতিরিক্ত যুক্তিগুলি মোকাবেলায় সুবিধাজনক ব্যবহার করি । এখানে একটি সাধারণ print()মোড়কের উদাহরণ :

def my_print(*args, **kwargs):
    prefix = kwargs.pop('prefix', '')
    print(prefix, *args, **kwargs)

তারপর:

>>> my_print('eggs')
 eggs
>>> my_print('eggs', prefix='spam')
spam eggs

আপনি দেখতে পাচ্ছেন, যদি prefixএটি অন্তর্ভুক্ত না থাকে kwargsতবে ডিফল্ট ''(খালি স্ট্রিং) স্থানীয় prefixভেরিয়েবলে সংরক্ষণ করা হচ্ছে । যদি এটি দেওয়া হয়, তবে এর মান ব্যবহার করা হচ্ছে।

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


কিভাবে একটি ডিফল্ট মান নির্ধারণ করার জন্য ধন্যবাদ prefix
এইচবিট

11

এটি কেবল এটি:

if 'errormessage' in kwargs:
    print("yeah it's here")

কীটি অভিধানে রয়েছে কিনা তা আপনাকে পরীক্ষা করতে হবে। এর সিনট্যাক্সটি হ'ল some_key in some_dict(যেখানে some_keyকিছু হ্যাশযোগ্য, প্রয়োজনীয় কোনও স্ট্রিং নয়)।

আপনি যে ধারণাগুলি লিঙ্ক করেছেন ( এই ধারনা ) চেক করার জন্য উদাহরণ অন্তর্ভুক্ত যদি নির্দিষ্ট কী দ্বারা ফিরে অভিধান অস্তিত্ব locals()এবং globals()। আপনার উদাহরণটি অনুরূপ, কারণ আপনি kwargsঅভিধানে নির্দিষ্ট কীটির অস্তিত্ব পরীক্ষা করছেন (শব্দগুচ্ছ যুক্তিযুক্ত অভিধান)।


3

একটি উপায় এটি নিজের দ্বারা যুক্ত করা হয়! কিভাবে? kwargsএকগুচ্ছ ডিফল্টের সাথে মার্জ করে। এটি সমস্ত অনুষ্ঠানের ক্ষেত্রে উপযুক্ত হবে না, উদাহরণস্বরূপ, কীগুলি আপনাকে আগেই জানা না থাকলে। তবে, যদি তারা থাকে তবে এখানে একটি সাধারণ উদাহরণ রয়েছে:

import sys

def myfunc(**kwargs):
    args = {'country':'England','town':'London',
            'currency':'Pound', 'language':'English'}

    diff = set(kwargs.keys()) - set(args.keys())
    if diff:
        print("Invalid args:",tuple(diff),file=sys.stderr)
        return

    args.update(kwargs)            
    print(args)

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


1

আপনি সহজেই এই জিনিসগুলি আবিষ্কার করতে পারেন:

def hello(*args, **kwargs):
    print kwargs
    print type(kwargs)
    print dir(kwargs)

hello(what="world")

13
"সহজ" সরান এবং তারপরে এটি আরও ভাল উত্তর। যদি সবার জন্য এটি সহজ ছিল, তবে আমাদের এই সাইটের প্রয়োজন হবে না। খোঁজা inনিজেই অপারেটর সহজ যদি আপনি প্রোগ্রাম করেছি এবং / অথবা পাইথন নতুন নয়। এটি কেবলমাত্র সহায়তা dict.get()এবং সহায়তাতে ইঙ্গিত করা হচ্ছে dict.setdefault()
সিএফআই

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