小编Gra*_*ham的帖子

在Python中实现存储库模式?

主要是出于好奇,我正在寻找一个Python框架或示例,用于将持久性逻辑与域逻辑分离的Repository Pattern.

命名为"库模式"出现在帖子" Untangle的域名和持久性逻辑与馆长 "(红宝石),主意来自一个部分的"领域驱动设计"一书和马丁·福勒.模型类不包含持久性逻辑,而是应用程序声明存储库子类,其实例的作用类似于模型实例的内存中集合.每个存储库以不同的方式持久化模型,例如SQL(各种模式约定),Riak或其他noSQL以及内存(用于缓存).框架约定意味着存储库子类通常需要最少的代码:只是声明SQLRepository的"WidgetRepository"子类将提供一个集合,该集合将模型Widget持久保存到名为"widgets"的DB表,并将列与Widget属性匹配.

与其他模式的差异:

活动记录模式:例如,Django ORM.应用程序仅定义具有域逻辑的模型类和用于持久性的一些元数据.ORM将持久性逻辑添加到模型类.这将域和持久性混合在一个类中(根据帖子不合需要).

感谢@marcin我看到当Active Record支持多种后端和.save(using ="other_database")函数时,它提供了存储库模式的多后端优势.

所以在某种意义上,Repository Pattern就像Active Record一样,持久性逻辑被移动到一个单独的类中.

数据映射器模式:例如,SQLAlchemy的Classical Mappings.该应用程序定义了数据库表的附加类,以及从模型到表的数据映射器.因此,模型实例可以以多种方式映射到表,例如,以支持遗留模式.不要以为SQLAlchemy为非SQL存储提供映射器.

python repository-pattern

24
推荐指数
2
解决办法
2万
查看次数

用于模板动画/不显眼的服务器脚本的Python工具?

是否有优秀的Python库可以为所谓的"模板动画","不显眼的服务器脚本"或"将数据绑定到标记"提供优雅的解决方案?

换句话说,我正在寻找一个好的API来将数据绑定到纯HTML以生成动态网页.

如果它将API调用和HTML编译成HTML发射代码,那么奖励点就是如此,因为它解析HTML的速度很慢,操纵它然后序列化回HTML.

背景

这个问题是由" 你的模板引擎糟透了,你写的所有东西都是意大利面条代码(是的,你) "博客文章提倡纯HTML的模板动画,以避免混合模板系统固有的语言.

不是在单个模板(view.tmpl)中混合数据绑定和标记,而是将数据绑定分离到它自己的代码文件(view.py),只在模板中保留HTML(view.html).

分离的明显好处是设计人员可以独立于开发人员和后端实现在HTML中编写视图.然后,设计人员可以在他选择的工具集中迭代地改进视图HTML.设计人员通常不喜欢用模板语言进行攻击并运行完整的开发环境和Web服务器来可视化更改.

动画HTML的潜在缺点

  • 性能缓慢.解析HTML,操纵结构来绑定数据,然后序列化回HTML,比处理编译模板慢3倍.毕竟模板语言对于打印HTML的代码来说确实是语法糖.hquery Ruby库通过将hquery代码和HTML编译成传统模板来解决这个问题.很好地展示了基于Ruby的DSL的强大功能.可以用Python完成吗?

  • 仅限于HTML和XML.模板动画依赖于HTML的结构,与许多模板语言相比,它们并不关心标记,而是像HTML一样快乐地生成纯文本或CSS.我不认为这对Web应用程序来说是一个问题,而像Genshi这样的模板语言则以在有效XML结构中工作而自豪.

  • 太复杂了.使用DOM操作HTML非常痛苦.希望正确的API能够在代码中操作HTML,就像向HTML添加模板指令一样简单.

调查

非Python解决方案

  • 用于Ruby的hquery,被称为"不显眼的服务器脚本",是一种从数据结构中填充HTML的DSL.这些HTML操作编译为ERB模板以便快速执行.

  • 用于PHP的queryTemplates,描述为"DOM和CSS驱动的模板",提供"数据注入方法".API使用jQuery启发的调用链.该代码描述了如何将PHP数据结构绑定到HTML,并将结果编译为.php模板以接受具体的数据结构

  • 用于将JSON绑定到HTML的 JavaScript库.需要额外的"指令"JSON,描述如何将JSON数据与HTML元素相关联.

  • diazo for Python.需要一个rules.xml,它与设计者的纯HTML主题一起编译为一个XSLT"模板",它将动态HTML或XML从webapp绑定到主题.

queryTemplates,pure和diazo需要一个关于如何将数据绑定到HTML的抽象描述 - 分别以链式API调用,JSON和XML规则的形式.然后系统编译模板以接受用于绑定的具体数据.抽象数据绑定描述添加了一个间接层,我怀疑需要使用更多的心理体操,而不是将模板指令添加到HTML.

然而,hquery通过让它的API调用接受数据查找表达式而使自己脱颖而出,这些表达式在某种程度上未被评估并保留在已编译的ERB中.它是一种类似于lisp的"代码作为数据"操作模式,至少非常酷,并且可能更容易编写.

其他有趣的库

  • PyMeld for Python,基于字符串替换的类似DOM.我试了一下,发现它很麻烦.填充表格涉及从表格中删除样本行,然后使用记录数据重复填充该行并将副本附加到表格中.啊.

  • Node.js的板块 "将数据绑定到标记"(即JSON到HTML).这就像胡子没有任何小胡子的模板语法.我希望从JSON直接填充HTML限制了它非常简单的数据绑定.甚至没有看到一个循环的例子.

  • HTML :: Zoom for Pearl.这是Perl的jQuery.不编译.

Python的起点

  • lxml.etree事实上的Python XML/HTML库.也许和DOM一样痛苦.是为解析/生成XML而编写的,而不是与现有HTML绑定的数据.但它是构建模板动画库的一个不错的基础.

  • pyquery建立在lxml.etree和lxml.cssquery之上.逐个方法地模拟jQuery API.这使得它优于HTML操作,但缺乏将数据结构绑定到HTML的便利功能.这些可以添加,只有回退会很慢,因为它本身就是一个解析操作序列化过程.

  • 傀儡通过brandizzi,建立在lxml.etree和lxml.cssquery的顶部.它刚刚开始,但是专门用于数据绑定的过程API.

即使有一个很好的API将数据绑定到HTML,它也会很慢,除非它可以编译成HTML发射代码,或者至少编译成传统的模板语言.

处理包括和主人

处理包含共享页脚或导航以及处理布局主页(也称为模板继承)是一个相关问题.纯HTML必须完整并扩展为可用作预览,因此这些扩展在数据绑定步骤之前发生.存在用于管理常见包含和布局的工具 - DreamWeaver for one具有用于共享页脚等的库系统.

python template-engine

8
推荐指数
0
解决办法
425
查看次数

从 Python 代码中提取“额外”文档字符串?

紧跟在类或函数声明之后的 Python 文档字符串放置在__doc__属性中。

问题:如何提取函数中稍后出现的附加“内部”文档字符串?

更新:编译器会忽略此类文字语句。我可以通过 AST 找到他们(以及他们的线路号码)吗?


我为什么要问?

我有一个(尚未完全成熟的)想法,使用此类“内部”文档字符串来描述敏捷场景的给定/何时/然后部分:

def test_adding():
    """Scenario: Adding two numbers"""
    adder = Adder()
    """When I add 2 and 3"""
    result = adder.add(2, 3)
    """Then the result is 5"""
    assert result == 5
Run Code Online (Sandbox Code Playgroud)

通过提取文档字符串,测试运行框架可以生成如下输出:

Scenario: Adding two numbers
   When I add 2 and 3 (PASS)
   Then the result is 5 (FAIL)

AssertionError   Traceback
...
Run Code Online (Sandbox Code Playgroud)

我认为这比BehaveFreshenLettucePyCukes中采用的方法更简洁,这些方法需要为每个步骤定义一个单独的函数。我不喜欢必须将步骤文本作为函数名称重复 ( @When("I add numbers") def add_numbers())。但与普通的单元测试不同,文档字符串将添加打印出业务可读场景以供参考的功能。

python docstring

4
推荐指数
1
解决办法
1538
查看次数