65.9K
CodeProject 正在变化。 阅读更多。
Home

IronPython入门

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (2投票s)

2013年6月14日

CPOL

4分钟阅读

viewsIcon

19705

IronPython 简介。

引言

好的,您已经阅读了关于 IronPython 语法的章节。 太棒了,学习一门新的编程语言很容易! 您觉得自己像一个通晓多种语言的人。 有什么大惊小怪的? 剩下的就是一些形式上的东西。 安装框架并快速创建一个应用程序来演示它有多么容易。 唯一的问题是没有任何东西起作用,而且错误消息毫无意义。

回到编程初学者的世界。

您需要学习一些实用的课程,然后才能说您是一个合格的 Python 程序员。 能够解释常见的错误消息并构建您的项目非常重要。 通常您会发现官方文档会略过这些内容,因为他们希望将其留给您自行决定。 因此,您会发现自己正在互联网上搜索博客来寻求帮助!

  • 您可以使用 ipy.exe 从命令行执行,使用 IronPython 控制台或 VS 工具。

例如,从 IronPython 调用 C# 代码

使用 IronPython 创建一些测试/规范; 一个静态的 .NET CLR 类和一个普通的 .NET CLR 类。 这些类将包含在一个名为 Polyglot 的程序集项目中,因为我们希望在此示例中使用多种编程语言。

  • Greet 静态 类。 具有一个方法和一个属性。 该方法接受一个参数,一个名称,并返回该名称的问候语,例如“Hello Jon”。 该属性仅返回一个字符串“Hello World!”。
  • Math 类。 这个类处理简单的算术,不处理负数,维护一个答案列表。 它有 Add 和 Subtract 方法,如果它不能返回正数,则 Subtract 方法会抛出异常。 它还有一个包含所有结果的数组,最近的结果位于列表的开头。

RunTests.py 

import sys
import unittest
import clr
sys.path.Add('C:\\sut') # folder containing software to be tested
clr.AddReferenceToFile('Polyglot.dll')

from Polyglot import Greet

class GreetTest(unittest.TestCase):
    softwareUnderTest = Greet
    def testGreet_ShowCsGreeting_GreetWithName(self):     
        self.assertEquals('Hello Brian', self.softwareUnderTest.GreetMe('Brian'), 'Greet Me test')        
    def testGreet_ShowCsGreeting_GreetHello(self):  
        self.assertEquals('Hello World!', self.softwareUnderTest.Hello, 'Greet Hello test')

from Polyglot import Math

class MathTest(unittest.TestCase):
    softwareUnderTest = Math()
    def testMath_Add_Simple(self):
        self.assertEquals(3, self.softwareUnderTest.Add(1,2), 'Simple Add')
    def testMath_Subtract_Simple(self):
        self.assertEqual(3, self.softwareUnderTest.Subtract(5,2), 'Simple Subtract')
    def testMath_Subtract_NegativeResultFails(self):
        with self.assertRaises(ValueError):
            self.softwareUnderTest.Subtract(3, 4)
    def testMath_Results_IsSetAndOrdered(self):
        result1 = 2
        result2 = 3
        result3 = 4
        self.softwareUnderTest = Math()
        self.assertEqual(0, len(self.softwareUnderTest.Results)) # to begin with there are no results
        self.softwareUnderTest.Add(1,1)
        self.assertEqual(1, len(self.softwareUnderTest.Results)) # after one operation there will be one result
        self.assertEqual(result1, self.softwareUnderTest.Results[0]) # check the result

        # run a couple more operations and check they are stored propery
        self.softwareUnderTest.Subtract(5,2)
        self.softwareUnderTest.Add(2,2)
        self.assertEqual(result3, self.softwareUnderTest.Results[0])
        self.assertEqual(result2, self.softwareUnderTest.Results[1])
        self.assertEqual(result1, self.softwareUnderTest.Results[2])

try:
    if __name__ == '__main__':
        unittest.main()
except:
    e = sys.exc_info()[0]
    print( "Error: %s" % e )
    clr.ClearProfilerData() # unload the .dll file so the file lock is released

a=raw_input('The end!')  

 

这些是前面测试指定的 C# 类。 您只需要创建一个 C# 类库项目。 在项目属性的“生成事件”下,将以下代码添加到 生成后事件命令行:

copy $(TargetPath) C:\sut
copy $(TargetDir)$(TargetName).pdb C:\sut

Greet.cs

namespace Polyglot
{
    public static class Greet
    {
        public static string GreetMe(string name)
        {
            return string.Format("Hello {0}", name);
        }

        public static string Hello { get { return "Hello World!"; } }
    }
}

Math.cs

using System.Collections.Generic;

namespace Polyglot
{
    public class Math
    {
        List _results;
        public Math()
        {
            _results = new List();
        }

        public uint Add(uint x, uint y)
        {
            return lastResult = x + y;
        }

        public uint Subtract(uint x, uint y)
        {
            if (y > x)
                throw new System.ArgumentException("Operation would result in a negative result");

            return lastResult = x - y;
        }

        private uint lastResult
        {
            set
            {
                _results.Insert(0, value);
            }
        }

        public uint[] Results
        {
            get { return _results.ToArray(); }
        }
    }
} 

注意事项 

  1. 第 2 行:import unittest
    使用 PyTest 默认框架,它类似于 .NET 中的 NUnit。
  2. 第 4 行:sys.path.Add('C:\\sut')
    我们已将一个目录添加到系统路径。 这是我存储 Polyglot.dll 将被测试的地方。
  3. 第 5 行:clr.AddReferenceToFile('Polyglot.dll')
    添加对 Polyglot 程序集的引用,以便可以通过 CLR 调用它。
  4. 第 7 行:from Polyglot import Greet
    指定将使用 Polygot 命名空间中的 Greet 类。 C# 中没有等效的命令,因为 C# 本质上使用命名空间中的所有类型,即 using namespace
  5. 第 9 行:class GreetTest(unittest.TestCase)
    括号用于从一个类继承
  6. 第 10 行:softwareUnderTest = Greet
    创建了对 C# Greet 类类型 的引用。 这是一个静态类,因此我们可以通过直接从类型引用中调用方法来调用该类的方法。
  7. 第 19 行:softwareUnderTest = Math()
    创建了 C# Math 类的 实例不需要像 C# 中那样使用 new 关键字,但是我们必须记住使用括号
  8. 方法 def 定义和 self。 所有类级变量、方法和类型都使用 self. 引用
  9. 缩进和空白很重要。 Python 使用这些而不是基于 C 语言中的 {}。
  10. 第 46 行:unittest.main() 用于执行单元测试。

常见错误

说,避免这些错误非常好,但最好知道在您犯错误时如何修复错误。 让我们看看如果我们引入一些典型的初学者错误会发生什么。

  1. 第 2 行:import unittest,当它被删除时

    NameError:未定义全局名称“unittest”

  2. 第 4 行:sys.path.Add('C:\\sut'),当它被删除时

    System.IO.IOException:无法添加对程序集 Polygot.dll 的引用

  3. 第 5 行:clr.AddReferenceToFile('Polyglot.dll'),当它被删除时

    TypeError:没有名为 Polygot 的模块

  4. 第 7 行:from Polyglot import Greet,当它被删除时

    NameError:未定义全局名称“Greet”

  5. 第 9 行:class GreetTest(unittest.TestCase): 如果“:”缺失

    SyntaxError:意外的标记“换行符”

  6. 第 10 行:softwareUnderTest = Greet 如果意外添加了括号

    无法创建 Greet 的实例,因为它已抽象

  7. 第 19 行:softwareUnderTest = Math() 如果 () 丢失

    TypeError:减法需要正好 3 个参数(给出 2 个)

    在 Python 中,第一个参数始终是类实例,因此它期望一个额外的参数; Math.Subtract(Math(),2,1) 将起作用。

  8. 方法 def 定义和 self

    TypeError:testMath_Add_Simple() 不需要参数(给出 1 个)

  9. 缩进和空白很重要。 它会导致各种错误

    IndentationError:缩进与任何其他缩进级别不匹配

    IndentationError:意外缩进

  10. 第 46 行:unittest.main() 没有它,就不会执行任何测试。

参考文献

© . All rights reserved.