سؤال

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

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

ومع ذلك ، عندما أحاول إنشاء القاعدة ، أحصل على خطأ.ماذا أفعل خطأ?

import clips

#user = True

#def py_getvar(k):
#    return globals().get(k)
def py_getvar(k):
    return True if globals.get(k) else clips.Symbol('FALSE')

clips.RegisterPythonFunction(py_getvar)

print clips.Eval("(python-call py_getvar user)") # Outputs "nil"

# If globals().get('user') is not None: assert something
clips.BuildRule("user-rule", "(neq (python-call py_getvar user) nil)", "(assert (user-present))", "the user rule")
#clips.BuildRule("user-rule", "(python-call py_getvar user)", "(assert (user-present))", "the user rule")

clips.Run()
clips.PrintFacts()
هل كانت مفيدة؟

المحلول

تلقيت بعض المساعدة في مجموعة دعم Pyclips.الحل هو ضمان إرجاع دالة Python الخاصة بك كائحة كائنات ومستخدمها (اختبار ...) لتقييم الوظائف في LHS القواعد.يبدو أن استخدام إعادة التعيين () ضروريا أيضا لتنشيط قواعد معينة.

giveacodicetagpre.

نصائح أخرى

مشكلتك لديها ما تفعله مع (neq (python-call py_getvar user) 'None').يبدو أن المقاطع لا تحب العبارة المتداخلة.يبدو أن محاولة التفاف استدعاء دالة في بيان المساواة تفعل أشياء سيئة.ومع ذلك ، لن تؤكد القيمة على أي حال لأن وظيفتك ترجع إما لا شيء أو القيمة.بدلا من ذلك ، ما تريد القيام به هو هذا:

def py_getvar(k):
    return clips.Symbol('TRUE') if globals.get(k) else clips.Symbol('FALSE')

ثم مجرد تغيير "(neq (python-call py_getvar user) 'None')" إلى "(python-call py_getvar user)"

وهذا يجب أن يعمل.لم تستخدم بيكليبس قبل العبث معها الآن فقط ، ولكن هذا يجب أن تفعل ما تريد.

هث!

>>> import clips
>>> def py_getvar(k):
...     return clips.Symbol('TRUE') if globals.get(k) else clips.Symbol('FALSE')

...
>>> clips.RegisterPythonFunction(py_getvar)
>>> clips.BuildRule("user-rule", "(python-call py_getvar user)", "(assert (user-
present))", "the user rule")
<Rule 'user-rule': defrule object at 0x00A691D0>
>>> clips.Run()
0
>>> clips.PrintFacts()
>>>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top