IronPython:您曾经用IronPython而不是标准的.NET语言(例如C#)做过哪些工作

IronPython:您曾经用IronPython而不是标准的.NET语言(例如C#)做过哪些工作,python,ironpython,Python,Ironpython,我正在和Python一起学习IronPython。我很好奇与标准的.NET语言相比,您更倾向于使用IronPython处理哪些类型的任务 感谢您提供的示例。一个与IronPython完美匹配的示例是,您希望在应用程序中包含脚本能力。我一直在开发一些系统,在这些系统中,用户可以通过应用程序内python脚本层直接与整个应用程序类模型交互,这为高级用户提供了极大的灵活性 一个具体的例子是,当您希望在应用程序中公开“钩子”时,用户可以自定义业务规则(例如,在交易系统中创建新交易时,进行自定义经纪人费用

我正在和Python一起学习IronPython。我很好奇与标准的.NET语言相比,您更倾向于使用IronPython处理哪些类型的任务


感谢您提供的示例。

一个与IronPython完美匹配的示例是,您希望在应用程序中包含脚本能力。我一直在开发一些系统,在这些系统中,用户可以通过应用程序内python脚本层直接与整个应用程序类模型交互,这为高级用户提供了极大的灵活性

一个具体的例子是,当您希望在应用程序中公开“钩子”时,用户可以自定义业务规则(例如,在交易系统中创建新交易时,进行自定义经纪人费用计算)

按请求编辑: 下面是一个简单的(模拟的)示例。当用户在系统中创建新交易时,系统会检查是否定义了以下Python函数,如果存在,则交易会在提交到数据库之前获得函数的结果,作为向其添加的费用:

def calculate_broker_fee(trade):
    fee = 0.043 # default value
    if trade.exchange in ["SWX", "EURONEXT"] and \
        trade.instrument.instrument_type == "Bond":
        fee = trade.quantity*0.00234
    return fee

在日常工作中,它是我的标准语言,用于那些对.bat文件来说太多的构建过程,并且不够重,不需要单独的可执行文件;这包括任何可能使用一点XML处理或反射的东西——例如,通过系统处理32位和64位安装来生成Wix文件。它在这个角色上击败了PowerShell,因为IronPython是一个安装到构建机器上的XCOPY


它对于针对不熟悉或复杂的API(WMI和Active Directory对我来说是常见的)创建代码片段原型,或者使用这些API诊断代码中的问题(比如嗅出在域控制器上而不是在其他地方发生的奇怪现象)也非常有用.

为MS Group聊天服务器插件创建了加载工具。gcapi是C#格式的。我将其包装到一个dll中,并让FePy加载它。主应用程序、配置脚本等都在FePy中。

我刚刚在本月初部署了IronPython销售点服务应用程序。服务应用程序是一个RESTful http服务器,向.NET WinForms客户端提供查询和事务请求。在某些远程处理库的帮助下,服务应用程序纯粹是用IronPython实现的

在我看来,Python无疑是编写复杂业务逻辑的最佳语言。以下是我的理由

  • 这种语言很有表现力。我可以想出无限的内部DSL想法,使我的业务逻辑更短、更容易理解

  • 它是互动的。故障排除和逻辑测试可以交互进行

  • 它是动态的。这是自由。没有xml配置。没有水管。没有编译

  • 我可以在我最喜欢的编辑器中工作

  • 大多数怀疑论者总是提到“代码完成”和“调试器”。我有时会想念他们。然而,我意识到我故意放弃了这些便利条件,取而代之的是一个更重要的因素,可理解性。通过适当的单元测试和日志记录,我会选择IronPython而不是任何语言来进行业务逻辑

    更新:

    有时,我会使用Ironpython脚本来试验和记录用户问题,就像是这样的客户端:

    >> from boon.service import client
    >> CASH_PAYMENT_TYPE = '000000011'
    >> cl = client.Client('http://pos-server/bin?posB2K')
    >> cl.connect('user', 'password')
    >> order = cl.workspace('pos.Order')
    >> order.load('1312')
    >> payments = order.dataset.Tables['POS_PAYMENTS']
    >> payments.Rows[0]['PAYMENT_TYPE_ID'] = CASH_PAYMENT_TYPE
    >> order.save()
    
    >> from boon import pos
    >> pos.register_pos_service(debug=True)
    >> from boon.service import get_instance
    >> possvc = get_instance('pos')
    >> print possvc.store['POS_PAYMENTS'] \
    ..   .where(lambda r: r.POS_HD_ID == 1312) \
    ..   .include('PAYMENT_TYPE_ID', 'PAY_AMT') \
    ..   .list()
    [('000000011', 1520)]
    
    有时,我会通过编写服务器对象脚本来调查bug,如下所示:

    >> from boon.service import client
    >> CASH_PAYMENT_TYPE = '000000011'
    >> cl = client.Client('http://pos-server/bin?posB2K')
    >> cl.connect('user', 'password')
    >> order = cl.workspace('pos.Order')
    >> order.load('1312')
    >> payments = order.dataset.Tables['POS_PAYMENTS']
    >> payments.Rows[0]['PAYMENT_TYPE_ID'] = CASH_PAYMENT_TYPE
    >> order.save()
    
    >> from boon import pos
    >> pos.register_pos_service(debug=True)
    >> from boon.service import get_instance
    >> possvc = get_instance('pos')
    >> print possvc.store['POS_PAYMENTS'] \
    ..   .where(lambda r: r.POS_HD_ID == 1312) \
    ..   .include('PAYMENT_TYPE_ID', 'PAY_AMT') \
    ..   .list()
    [('000000011', 1520)]
    

    您可能会发现代码不太优雅,因为我更喜欢基于ADO.NET数据集进行工作。但是,Windoows窗体客户端更简单。

    我使用IronPython有几个不同的用途:

    • 当我需要编写脚本并调用.NET库时,或者当脚本复杂到足以保证使用真正的编程语言时,这是Powershell的替代方案
    • 在.NET应用程序中嵌入可编写脚本的插件
    • 在即时模式下原型化和测试.NET LIB。这比用C编写测试项目要容易得多#

    我们经常将其用于针对SharePoint的小型管理工具。特别是,它非常适合于针对真实数据(以及真实生活中的所有怪癖)探索API。开发迭代更快,而且您不能总是在生产服务器上安装Visual Studio。

    +1个有趣的问题。您能分享一些代码片段让我更具体地了解吗?@Ricked:您的意思是“计算代理费”由用户维护,以自定义他们的需求?是的,确实如此。如果函数不在那里,那么系统使用其内部默认计算(在这种情况下用C++编写,通常在IronPython情况下是C)。但是,如果用户需要自定义计算,他/她可以提供。应该注意的是,与基于C的API稍微笨拙的常规CPython相比,使用DotNet/DLR实现此类挂钩非常简单。另一件好事是,它可以很容易地为其他DLR语言(如IronRuby)提供支持,允许用户用他/她熟悉的语言编写自定义项。@Rickard:IronPython可以运行IronRuny?您能在解释中给出更多具体的例子吗?而不是大量复制,以下是我关于这个主题的几篇博文:前一篇为fir,后一篇为fir+1。我更喜欢IronPython而不是C#for everything.NET。出于上述所有原因。