IronPython入门





4.00/5 (2投票s)
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(); }
}
}
}
注意事项
第 2 行:import unittest
使用 PyTest 默认框架,它类似于 .NET 中的 NUnit。第 4 行:sys.path.Add('C:\\sut')
我们已将一个目录添加到系统路径。 这是我存储 Polyglot.dll 将被测试的地方。第 5 行:clr.AddReferenceToFile('Polyglot.dll')
添加对 Polyglot 程序集的引用,以便可以通过 CLR 调用它。第 7 行:from Polyglot import Greet
指定将使用 Polygot 命名空间中的Greet
类。 C# 中没有等效的命令,因为 C# 本质上使用命名空间中的所有类型,即using namespace
。第 9 行:class GreetTest(unittest.TestCase)
括号用于从一个类继承第 10 行:softwareUnderTest = Greet
创建了对 C#Greet
类类型 的引用。 这是一个静态类,因此我们可以通过直接从类型引用中调用方法来调用该类的方法。第 19 行:softwareUnderTest = Math()
创建了 C#Math
类的 实例。 不需要像 C# 中那样使用new
关键字,但是我们必须记住使用括号。- 方法
def
定义和self
。 所有类级变量、方法和类型都使用self.
引用 - 缩进和空白很重要。 Python 使用这些而不是基于 C 语言中的 {}。
第 46 行:unittest.main()
用于执行单元测试。
常见错误
说,避免这些错误非常好,但最好知道在您犯错误时如何修复错误。 让我们看看如果我们引入一些典型的初学者错误会发生什么。
第 2 行:import unittest
,当它被删除时
NameError:未定义全局名称“unittest”
第 4 行:sys.path.Add('C:\\sut')
,当它被删除时
System.IO.IOException:无法添加对程序集 Polygot.dll 的引用
第 5 行:clr.AddReferenceToFile('Polyglot.dll')
,当它被删除时
TypeError:没有名为 Polygot 的模块
第 7 行:from Polyglot import Greet
,当它被删除时
NameError:未定义全局名称“Greet”
第 9 行:class GreetTest(unittest.TestCase):
如果“:
”缺失
SyntaxError:意外的标记“换行符”
第 10 行:softwareUnderTest = Greet
如果意外添加了括号
无法创建 Greet 的实例,因为它已抽象
第 19 行:softwareUnderTest = Math()
如果()
丢失
TypeError:减法需要正好 3 个参数(给出 2 个)
在 Python 中,第一个参数始终是类实例,因此它期望一个额外的参数;
Math.Subtract(Math(),2,1)
将起作用。- 方法
def
定义和self
。
TypeError:testMath_Add_Simple() 不需要参数(给出 1 个)
- 缩进和空白很重要。 它会导致各种错误
IndentationError:缩进与任何其他缩进级别不匹配
IndentationError:意外缩进
第 46 行:unittest.main()
没有它,就不会执行任何测试。