سؤال

هل هناك طريقة لتمرير القائمة كحجة وظيفة إلى وحدة التقييم () أو القيام لدي لتحويله إلى سلسلة ثم تحليل أنها قائمة في وظيفة؟

وبلدي مثال بسيط يشبه:

 eval("func1(\'" + fArgs + "\')")

وأنا فقط وليس متأكدا مما اذا كان هناك طريقة أفضل من أخذ fArgs كقائمة بدلا من سلسلة

ملحوظة: يتم توفير قائمة من استجابة JSON

وتحرير: طيب هنا أكثر قليلا من صفي لذلك هناك فهم أفضل لكيفية أنا باستخدام وحدة التقييم

def test(arg):
     print arg

#Add all allowed functions to this list to be mapped to a dictionary     
safe_list = ['test']
safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])

class Validate:
     def __init__(self, Value, fName, fArgs):
     eval(fName + "(\'" + fArgs + "\')", {"__builtins__":None},safe_dict)

وقد أكون مخطئا في هذا التفكير، ولكن لبلدي فهم هذا هو الاستخدام الآمن للوحدة التقييم لأن المهام الوحيدة التي يمكن استدعاؤها هي تلك التي يتم سردها في القاموس safe_list. وظيفة ليتم تشغيلها ويجري استخراج حجج لتلك الوظيفة من كائن JSON. الحجج هي أن تنظم على شكل قائمة، ويل الانضمام إلى قائمة جنبا إلى جنب مع "،" أن تفسر على أنها الحجج الفعلية أو مجرد حجة واحدة؟

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

المحلول

إذا كنت تستخدم بايثون 2.6.x، ثم عليك أن تكون قادرا على استخدام وحدة json (انظر وثيقة الحمر <لأ href = "http://docs.python.org/library/json.html" يختلط = "noreferrer"> 19.2 ). إن لم يكن، ثم هناك بيثون سلمان متاح من خلال مؤشر حزمة بايثون. كل من هذه الحزم سيوفر القارئ لتحليل البيانات JSON إلى نوع بيانات بيثون المناسب.

لمشكلة الثانية من استدعاء دالة يحددها رسالة، يمكنك القيام بما يلي:

def foo():
    print 'I am foo!'
def bar():
    pass
def baz():
    pass

funcs = {'func_a':foo, 'func_b':bar, 'func_c':baz}

funcs['func_a']()

وهذا النهج يمكن أن يكون قليلا أكثر أمنا من eval لأنه يمنع وظائف مكتبة الثعبان "غير آمنة" من حقنها في JSON. ومع ذلك، لا تزال تحتاج إلى توخي الحذر أن البيانات المقدمة إلى وظائف الخاص بك لا يمكن التلاعب بها أن يسبب مشاكل.

نصائح أخرى

على النحو التالي يعمل:

root@parrot$ more test.py
def func1(*args):
        for i in args:
                print i

l = [1,'a',9.1]
func1(*l)

root@parrot$ python test.py
1
a
9.1

وهكذا، لا حاجة مباشرة لوحدة التقييم ()، إلا إذا أنا سوء فهم شيء.

وعن طريق مكتبة تحليل المدخلات JSON قد يكون نهجا أفضل من وحدة التقييم، شيء من هذا القبيل:

import json
func1(json.loads(fArgs))

وتأكيد جي أن إدخال المستخدم هو الصحيح سيكون فكرة جيدة أيضا.

ووالبعض الآخر نقطة جيدة، وهذا يجب أن لا تستخدم eval. ولكن، إذا كان يجب عليك:

eval("func1(%s)" % ", ".join(fArgs))

وسوف استدعاء الدالة مع كل الحجج في القائمة. هذا:

eval("func1([%s])" % ", ".join(fArgs))

وسوف يطلق عليه مع قائمة الوسائط في حجة واحدة فقط. حتى ربما كنت تريد هذا؟

eval("func1([%s])" % ", ".join(map(eval, fArgs)))

والتي من شأنها أن eval الحجج كذلك؟

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