python منتديات استدعاء دالة وحدة نمطية باستخدام اسمها(سلسلة)




منتديات بايثون (7)

ما هي أفضل طريقة للذهاب حول استدعاء وظيفة معينة في سلسلة مع اسم الدالة في برنامج Python. على سبيل المثال ، لنفترض أن لدي وحدة foo ، ولديّ سلسلة تحتوي على "bar" . ما هي أفضل طريقة للانتقال بـ foo.bar() ؟

أحتاج إلى الحصول على قيمة الإرجاع للدالة ، ولهذا السبب لا أستخدم فقط eval . فكنت أحسب كيفية القيام بذلك باستخدام eval لتعريف دالة مؤقتة تقوم بارجاع نتيجة استدعاء الدالة ، لكنني آمل أن يكون هناك طريقة أكثر أناقة للقيام بذلك.

https://code.i-harness.com


أفضل إجابة طبقًا لأسئلة برمجة Python هي:

functions = {'myfoo': foo.bar}

mystring = 'myfoo'
if mystring in functions:
    functions[mystring]()

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


إذا نظرنا إلى سلسلة ، مع مسار python كامل لوظيفة ، فإن هذه هي الطريقة التي قمت بها للحصول على نتيجة الدالة المذكورة:

import importlib
function_string = 'mypackage.mymodule.myfunc'
mod_name, func_name = function_string.rsplit('.',1)
mod = importlib.import_module(mod_name)
func = getattr(mod, func_name)
result = func()

بافتراض وحدة foo مع bar الطريقة:

import foo
method_to_call = getattr(foo, 'bar')
result = method_to_call()

بقدر ما يتم ذلك ، يمكن ضغط الخط 2 و 3 إلى:

result = getattr(foo, 'bar')()

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


جرب هذا. في حين أن هذا لا يزال يستخدم eval ، فإنه يستخدم فقط لاستدعاء الدالة من السياق الحالي . ثم ، لديك وظيفة حقيقية لاستخدام ما تشاء.

الفائدة الرئيسية بالنسبة لي من هذا هو أنك سوف تحصل على أي أخطاء تتعلق بال EVal عند نقطة استدعاء الدالة. ثم ستحصل فقط على الأخطاء المتعلقة بالوظيفة عند الاتصال.

def say_hello(name):
    print 'Hello {}!'.format(name)

# get the function by name
method_name = 'say_hello'
method = eval(method_name)

# call it like a regular function later
args = ['friend']
kwargs = {}
method(*args, **kwargs)

لم يساعدني شيء مما اقترح. لقد اكتشفت هذا رغم ذلك.

<object>.__getattribute__(<string name>)(<params>)

أنا أستخدم python 2.66

أتمنى أن يساعدك هذا


لما يستحق ، إذا كنت بحاجة إلى تمرير اسم الوظيفة (أو الفصل) واسم التطبيق كسلسلة ، فيمكنك القيام بذلك:

myFnName  = "MyFn"
myAppName = "MyApp"
app = sys.modules[myAppName]
fn  = getattr(app,myFnName)

locals()["myfunction"]()

أو

globals()["myfunction"]()

locals بإرجاع قاموس مع جدول رمز محلي الحالي. globals إرجاع قاموس مع جدول رمز عمومي.





python