سؤال

لقد كتبت فئة في الثعبان التي أريد أن ألتفها في تجميع .NET عبر IronPython وفننا في تطبيق C #. لقد هاجرت الفئة إلى Ironpython، أنشأت مجموعة مكتبة وأشهدت إليها. الآن، كيف يمكنني فعلا على مثيل من هذا الفصل؟

يبدو الفصل (جزئيا) مثل هذا:

class PokerCard:
    "A card for playing poker, immutable and unique."

    def __init__(self, cardName):

كعب الاختبار كتبت في C # هو:

using System;

namespace pokerapp
{
    class Program
    {
        static void Main(string[] args)
        {
            var card = new PokerCard(); // I also tried new PokerCard("Ah")
            Console.WriteLine(card.ToString());
            Console.ReadLine();
        }
    }
}

ما الذي يجب علي فعله من أجل إنشاء هذه الفئة في C #؟

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

المحلول

فصول الحديدي ليس فصول .NET. إنها مثيلات من Ironpython.runtime.types.pythontype وهو عبارة عن بيثون Metaclass. وذلك لأن فئات Python هي إضافة ديناميكية ودعم وإزالة الطرق في وقت التشغيل، والأشياء التي لا يمكنك القيام بها مع فصول .NET.

لاستخدام فصول Python في C #، ستحتاج إلى استخدام فئة Offeroperations. يتيح لك هذه الفئة العمل على أنواع وثيبات الثعبان في دلالات اللغة نفسها. على سبيل المثال، يستخدم الأساليب السحرية عند الاقتضاء، يعزز التلقائي الأعداد الصحيحة إلى أوقات الشيشة وما إلى ذلك. يمكنك معرفة المزيد حول Outsoperations من خلال النظر إلى المصدر أو استخدام العاكس.

هنا مثال. حاسبة الحاسبة. تحتوي على فئة بسيطة:

class Calculator(object):
    def add(self, a, b):
        return a + b

يمكنك استخدامه من كودك المسبق 4.Net 4.0 C # مثل هذا:

ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile("Calculator.py");
ScriptScope scope = engine.CreateScope();

ObjectOperations op = engine.Operations;

source.Execute(scope); // class object created
object klaz = scope.GetVariable("Calculator"); // get the class object
object instance = op.Call(klaz); // create the instance
object method = op.GetMember(instance, "add"); // get a method
int result = (int)op.Call(method, 4, 5); // call method and get result (9)

ستحتاج إلى الرجوع إلى Assemblies Ironpython.dll، Microsoft.Scripting و Microsoft.Scripting.Core.

C # 4 جعل هذا أسهل بكثير مع الجديد نوع ديناميكي.

ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile("Calculator.py");
ScriptScope scope = engine.CreateScope();
source.Execute(scope);

dynamic Calculator = scope.GetVariable("Calculator");
dynamic calc = Calculator();
int result = calc.add(4, 5);

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

Install-Package IronPython

نصائح أخرى

الآن بعد أن تم إصدار .NET 4.0 ولديه نوع ديناميكي، يجب تحديث هذا المثال. باستخدام ملف Python نفسه كما في إجابة M-Sharp الأصلية:

class Calculator(object):
    def add(self, a, b):
        return a + b

هنا هو الطريقة التي ستدعوها باستخدام .NET 4.0:

string scriptPath = "Calculator.py";
ScriptEngine engine = Python.CreateEngine();
engine.SetSearchPaths(new string[] {"Path to your lib's here. EG:", "C:\\Program Files (x86)\\IronPython 2.7.1\\Lib"});
ScriptSource source = engine.CreateScriptSourceFromFile(scriptPath);
ScriptScope scope = engine.CreateScope();
ObjectOperations op = engine.Operations;
source.Execute(scope);

dynamic Calculator = scope.GetVariable("Calculator");
dynamic calc = Calculator();
return calc.add(x,y);          

مرة أخرى، تحتاج إلى إضافة مراجع إلى IronPyThon.dll و Microsoft.Scripting.

كما ترون، فإن الإعداد الأولي وإنشاء الملف المصدر هو نفسه.

ولكن بمجرد تنفيذ المصدر ينفذ بنجاح، فإن العمل مع وظائف بيثون أسهل بكثير بفضل الكلمة الرئيسية "الديناميكية" الجديدة.

أقوم بتحديث المثال أعلاه المقدمة من قبل الإنسان الذكي لفصول IronPython المترجمة (DLL) بدلا من التعليمات البرمجية المصدر IronPython في ملف .py.

# Compile IronPython calculator class to a dll
clr.CompileModules("calculator.dll", "calculator.py")

C # 4.0 رمز مع النوع الديناميكي الجديد هو كما يلي:

// IRONPYTHONPATH environment variable is not required. Core ironpython dll paths should be part of operating system path.
ScriptEngine pyEngine = Python.CreateEngine();
Assembly myclass = Assembly.LoadFile(Path.GetFullPath("calculator.dll"));
pyEngine.Runtime.LoadAssembly(myclass);
ScriptScope pyScope = pyEngine.Runtime.ImportModule("calculator");
dynamic Calculator = pyScope.GetVariable("Calculator");
dynamic calc = Calculator();
int result = calc.add(4, 5);

مراجع:

  1. باستخدام فئات Python المترجمة من .NET / CSHARP IP 2.6
  2. تجميع ثابت من البرامج النصية IronPython

لقد بحثت عالية ومنخفضة وأخشى أن لا يبدو أن هناك الكثير من المعلومات المتعلقة بهذا. أنا من المؤكد أن لا أحد قد ابتكر وسيلة للقيام بذلك بطريقة نظيفة ترغب في ذلك.

السبب الرئيسي الذي أعتقد أن هذه مشكلة هي أنه من أجل رؤية PokerCard اكتب تطبيق C # لديك لتجميع كود Python الخاص بك إلى IL. لا أعتقد أن هناك أي بيثون->البرمجيات il إلى هناك.

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