سؤال

ولدي وظيفة بيثون التي أنا أفعل بعض sanitisation من معلمات الإدخال:

def func(param1, param2, param3):
    param1 = param1 or ''
    param2 = param2 or ''
    param3 = param3 or ''

وهذا يلبي للوسائط يتم تمرير ك <م> لا يوجد بدلا من السلاسل الفارغة. هل هناك أسهل / وسيلة أكثر إيجازا للحلقة الجولة المعلمات وظيفة لتطبيق مثل هذا التعبير لهم جميعا. مهمتي الفعلية من تسعة المعلمات.

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

المحلول

وهذا يبدو وكأنه على وظيفة جيدة للالديكور. ماذا عن هذا:

def sanitized(func):
    def sfunc(*args, **kwds):
        return func(*[arg or '' for arg in args],
                    **dict((k, v or '') for k,v in kwds.iteritems()))
    sfunc.func_name = func.func_name
    sfunc.func_doc = func.func_doc
    return sfunc

هل استخدام هذا على وظيفة الخاص بك مثل ذلك:

@sanitized
def func(param1, param2, param3):
    print param1, param2, param3

وبعد ذلك سيتم استبدال المعلمات من قبل سلسلة فارغة إذا كانت كاذبة:

>>> func('foo', None, 'spam')
foo  spam

و(لاحظ أن هذه الفوضى سوف لا يزال حتى التوقيع وظيفة كما نيد باتشلدر يشير في جوابه. لإصلاح التي يمكن استخدامها <لأ href = "http://pypi.python.org/pypi/decorator" يختلط = "نوفولو noreferrer"> ميشيل Simionato وحدة الديكور - أعتقد أنك سوف تحتاج فقط إلى إضافة @decorator قبل تعريف sanitized)

نصائح أخرى

هل يمكن أن تفعل بعض التلاعب القائمة:

def func(param1, param2, param3):
    param1, param2, param3 = map(lambda x: x or '', (param1, param2, param3))

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

هل يمكن تغيير الإعلان عن وظيفة:

def func(*args):
    param1, param2, param3 = map(lambda x: x or '', args)

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

وأقول كتابة السطور تسعة، أو تغيير وظيفة لديها عدد أقل من المعلمات: تسعة هو نوع من الكثير على أي حال

!
def func(x='', y='', z='hooray!'):
    print x, y, z

In [2]: f('test')
test  hooray!

In [3]: f('test', 'and')
test and hooray!

In [4]: f('test', 'and', 'done!')
test and done!
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top