سؤال

كيف تختلف "وسيطات الكلمات الرئيسية" عن الوسيطات العادية؟لا يمكن تمرير كافة الحجج كما name=value بدلا من استخدام بناء الجملة الموضعي؟

هل كانت مفيدة؟

المحلول

وهناك نوعان من المفاهيم ذات الصلة، سواء يسمى ب "الحجج الكلمات الرئيسية".

في الجانب الدعوة، وهو ما قد ذكرت المعلقين الآخرين، لديك القدرة على تحديد بعض الحجج وظيفة بالاسم. عليك أن أذكرها بعد كل الحجج دون أسماء (الحجج الموضعية)، ويجب أن يكون هناك قيم الافتراضي لأي المعلمات التي لم يرد ذكرها على الإطلاق.

ومفهوم الآخر على الجانب تعريف الدالة: يمكنك تعريف دالة التي تأخذ المعلمات بالاسم - وأنت لا تملك حتى لتحديد ما هي هذه الأسماء. وهذه هي الحجج الكلمة النقية، ولا يمكن أن تنتقل positionally. بناء الجملة

def my_function(arg1, arg2, **kwargs)

وسيتم وضع أي حجج الكلمات الرئيسية التي تمرر إلى هذه الوظيفة في القاموس عين kwargs. يمكنك فحص مفاتيح هذا القاموس في وقت التشغيل، مثل هذا:

def my_function(**kwargs):
    print str(kwargs)

my_function(a=12, b="abc")

{'a': 12, 'b': 'abc'}

نصائح أخرى

وهناك ميزة واحدة لغة الماضية حيث التمييز مهم. النظر في وظيفة التالية:

def foo(*positional, **keywords):
    print "Positional:", positional
    print "Keywords:", keywords

والحجة *positional سيتم تخزين جميع الحجج الموضعية التي تم تمريرها إلى foo()، مع عدم وجود حد لعدد يمكنك تقديمها.

>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}

والحجة **keywords سيتم تخزين أي حجج الكلمة:

>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}

وبطبيعة الحال، يمكن استخدام كل من في نفس الوقت:

>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}

وهذه الميزات نادرا ما تستخدم، ولكن في بعض الأحيان أنها مفيدة للغاية، وأنه من المهم أن تعرف ما هي الحجج هي الموضعية أو الكلمات الرئيسية.

وعن طريق الحجج الكلمة هو نفس الشيء كوسائط العادية ما عدا النظام لا يهم. على سبيل المثال الوظيفتين المكالمات أدناه هي نفسها:

def foo(bar, baz):
    pass

foo(1, 2)
foo(baz=2, bar=1)

تحليل الحجج الموضعية

وليس لديهم كلمات من قبلهم. أمر مهم!

func(1,2,3, "foo")

تحليل معطيات الكلمات المفتاحية

ولديهم كلمات في الجبهة. ويمكن أن تكون في أي أمر!

func(foo="bar", baz=5, hello=123)

func(baz=5, foo="bar", hello=123)

ويجب أن نعلم أيضا أنه إذا كنت تستخدم الوسائط الافتراضية والإهمال لادخال الكلمات الرئيسية، ثم أمر يهم بعد ذلك!

def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)

هناك طريقتان لتعيين قيم الوسيطات لمعلمات الدالة، ويتم استخدام كليهما.

  1. حسب المنصب.لا تحتوي الوسائط الموضعية على كلمات رئيسية ويتم تعيينها أولاً.

  2. باستخدام الكلمات الرئيسية.تحتوي وسيطات الكلمات الأساسية على كلمات أساسية ويتم تعيينها ثانيًا بعد الوسائط الموضعية.

لاحظ أن أنت لديك خيار استخدام الحجج الموضعية.

لو أنت لا تستخدم الحجج الموضعية، إذن - نعم - كل شيء أنت write تبين أنها وسيطة للكلمات الرئيسية.

متى أنت استدعاء وظيفة تتخذ قرارًا باستخدام الموضع أو الكلمة الرئيسية أو خليط.يمكنك اختيار القيام بكل الكلمات الرئيسية إذا كنت تريد ذلك.البعض منا لا يتخذ هذا الاختيار ويستخدم الحجج الموضعية.

وأنا مندهش أن لا أحد يبدو أنه قد أشار إلى أن واحدا يمكن أن تمر قاموس المعلمات حجة مرتبطا، التي تلبي المعايير الرسمية، مثل ذلك.

>>> def func(a='a', b='b', c='c', **kwargs):
...    print 'a:%s, b:%s, c:%s' % (a, b, c)
... 
>>> func()
a:a, b:b, c:c
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'})
a:z, b:q, c:v
>>> 

استخدام بايثون 3 يمكنك الحصول على الكلمة الرئيسية المطلوبة وغير المطلوبة الحجج:

خياري:(القيمة الافتراضية المحددة لـ 'b')

def func1(a, *, b=42):
    ...
func1(value_for_a) # b is optional and will default to 42

مطلوب (لم يتم تحديد قيمة افتراضية لـ 'b'):

def func2(a, *, b):
    ... 
func2(value_for_a, b=21) # b is set to 21 by the function call
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'`

يمكن أن يساعد هذا في الحالات التي يكون لديك فيها العديد من الوسائط المتشابهة بجانب بعضها البعض، خاصةً عندما تكون من نفس النوع، وفي هذه الحالة أفضل استخدام الوسائط المسماة أو أقوم بإنشاء فئة مخصصة إذا كانت الوسائط تنتمي معًا.

وأنا مندهش أن أحدا لم يذكر حقيقة أنه يمكنك خلط الحجج الموضعية والكلمات الرئيسية أن تفعل أشياء متستر مثل ذلك باستخدام *args و**kwargs (<لأ href = "http://www.saltycrane.com/blog/2008 / 01 / كم إلى استخدام وسائط و-kwargs في والثعبان / "يختلط =" noreferrer "> من هذا الموقع ):

def test_var_kwargs(farg, **kwargs):
    print "formal arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])

وهذا يتيح لك استخدام الحجج الكلمة التعسفية التي قد يكون لها مفاتيح كنت لا تريد أن تحدد مقدما.

وكنت أبحث عن مثال كان kwargs الافتراضية باستخدام نوع الشرح:

def test_var_kwarg(a: str, b: str='B', c: str='', **kwargs) -> str:
     return ' '.join([a, b, c, str(kwargs)])

وعلى سبيل المثال:

>>> print(test_var_kwarg('A', c='okay'))
A B okay {}
>>> d = {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', c='c', b='b', **d))
a b c {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', 'b', 'c'))
a b c {}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top