سؤال

أرغب في معرفة ما إذا كان من الممكن تحديد ما إذا كان قد تم تمرير معلمة دالة ذات قيمة افتراضية في Python.على سبيل المثال، كيف يعمل dict.pop؟

>>> {}.pop('test')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'pop(): dictionary is empty'
>>> {}.pop('test',None)
>>> {}.pop('test',3)
3
>>> {}.pop('test',NotImplemented)
NotImplemented

كيف تحدد طريقة البوب ​​أنه في المرة الأولى لم يتم تمرير قيمة الإرجاع الافتراضية؟هل هذا شيء لا يمكن القيام به إلا في لغة C؟

شكرًا

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

المحلول

أعتقد أنك تقصد "وسيطة الكلمة الرئيسية"، عندما تقول "المعلمة المسماة". dict.pop() لا يقبل وسيطة الكلمة الرئيسية، لذا فإن هذا الجزء من السؤال محل نقاش.

>>> {}.pop('test', d=None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pop() takes no keyword arguments

ومع ذلك، فإن طريقة اكتشاف ما إذا كانت الوسيطة قد تم توفيرها هي استخدام *args أو **kwargs بناء الجملة.على سبيل المثال:

def foo(first, *rest):
    if len(rest) > 1:
        raise TypeError("foo() expected at most 2 arguments, got %d"
                        % (len(rest) + 1))
    print 'first =', first
    if rest:
        print 'second =', rest[0]

مع بعض العمل، واستخدام **kwargs من الممكن أيضًا محاكاة اصطلاح استدعاء بايثون بشكل كامل، حيث يمكن توفير الوسائط إما حسب الموضع أو بالاسم، والوسائط المقدمة عدة مرات (حسب الموضع والاسم) تسبب خطأ.

نصائح أخرى

الاتفاقية غالبا ما تستخدم arg=None والاستخدام

def foo(arg=None):
    if arg is None:
        arg = "default value"
        # other stuff
    # ...

للتحقق مما إذا تم تمريره أم لا.السماح للمستخدم بالمرور None, ، وهو ما سيتم تفسيره كما لو كانت الحجة لا اجتاز.

يمكنك القيام بذلك على النحو التالي:

def isdefarg(*args):
    if len(args) > 0:
        print len(args), "arguments"
    else:
        print "no arguments"

isdefarg()
isdefarg(None)
isdefarg(5, 7)

راجع وثائق بايثون على المكالمات للحصول على معلومات كاملة.

def f(one, two=2):
   print "I wonder if", two, "has been passed or not..."

f(1, 2)

إذا كان هذا هو المعنى الدقيق لسؤالك، فأعتقد أنه لا توجد طريقة للتمييز بين 2 التي كانت في القيمة الافتراضية و2 التي تم تمريرها.لم أجد كيفية تحقيق هذا التميز حتى في فحص وحدة.

لست متأكدًا مما إذا كنت أفهم تمامًا ما الذي تريده؛لكن:

def fun(arg=Ellipsis):
    if arg is Ellipsis:
        print "No arg provided"
    else:
        print "arg provided:", repr(arg)

هل هذا يفعل ما تريد؟إذا لم يكن الأمر كذلك، فكما اقترح الآخرون، يجب عليك الإعلان عن وظيفتك باستخدام ملف *args, **kwargs بناء الجملة والتحقق من إملاء kwargs لوجود المعلمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top