使用shlex编写的基于规则的unix样式配置分析器

oshlex的Python项目详细描述


oshlex(object shlex)-编写基于规则的unix样式配置分析器 使用shlex

这是一个简化阅读和分析任务的项目 Unix样式的配置文件。它只是一个抽象,使用shlex 库,通过 创建一组规则和处理程序,然后用于转换 标记到python数据结构中。

警告:目前只支持python>;3.4,python2.7 计划在不久的将来提供支持。

安装

您可以使用pip从pypi安装这个包。 鉴于Python2.7还不受支持,您可以按照 如下:

pip3.4 install oshlex

配置语法

默认情况下,配置文件语法尝试遵循标准 Unix配置文件语法,如中所示,例如nginx configs。 通过简单地子类化tokenizer类,或者创建 自己的类,其工作方式与shlex.shlex类相同(读取 详细信息)

示例配置文件

server {
        host 127.0.0.1;
        port 10000;
        user {
                username admin;
                password admin;
        }
        user {
                username test;
                password test;
        }
}

用法

oshlex.config有两个基本类,ruleconfiguration

oshlex.handlers有两个预定义的处理程序(文本和整数)

创建规则

在本例中,我们定义了一些规则来解析示例配置 文件,如上图所示。

基本思想是创建根规则并将其传递给配置 初始化时的对象。因此,所有其他规则都是 “根”规则。

规则类接受以下参数:

name-规则的名称,默认为“根”

handler-handler函数,接受令牌列表和 输出要在应用程序中使用的python数据结构。 oshlex.handlers模块有两个预定义的处理函数-text, 它接受一个令牌列表并将第一个令牌作为字符串返回,或者 如果令牌列表包含 不止一个元素,还有integer,其功能基本相同 只返回pythonint对象,或者引发unacceptabletoken 如果令牌不能转换为int类型,则出现异常。默认为 none,这意味着令牌由python字典表示 和副官。

unique-bool,定义所述选项是否可以接受 在配置文件中定义多次。如果true,则引发 如果在同一位置的两个位置定义了选项,则出现configerror异常 时间。如果false,则将每次出现的选项定义追加到 名单。默认为false

mandatory-bool,非常简单,如果选项是强制性的,但是 未定义-引发mandatoryoptionmissing异常,否则 没有什么。

基本示例

fromoshlex.configimportRule,Configurationfromoshleximporthandlers# Defining rulesroot=Rule('root')server=Rule('server',unique=True,mandatory=True)host=Rule('host',handler=handlers.text,unique=True,mandatory=True)port=Rule('port',handler=handlers.integer,unique=True,mandatory=True)user=Rule('user',unique=False,mandatory=False)username=Rule('username',handler=handlers.text,unique=True,mandatory=True)password=Rule('password',handler=handlers.text,unique=True,mandatory=True)# Chaining rules togetheruser.add(username)user.add(password)server.add(host)server.add(port)server.add(user)root.add(server)conf=Configuration(root)conf.read('./example.conf')

这样我们就得到了配置对象(conf),其内容如下 结构:

{'server':{'host':'127.0.0.1','port':10000,'user':[{'password':'admin','username':'admin'},{'password':'test','username':'test'}]}}

配置对象是可订阅的,因此您可以使用 此处允许使用词典:

>>>conf['server']['host']'127.0.0.1'

您可以定义自己的处理程序,这些处理程序只是接受 标记列表并返回python可以使用的内容,如果 需要以其他方式解析给定的令牌,例如 选项接受范围(例如1-10),然后我们需要定义一个hadler 为了将这些范围转换成整数列表,我们编写了一个处理程序:

fromoshlex.handlersimportUnacceptableToken,UnacceptableTokenCountdefrange(tokens):iflen(tokens)>1:raiseUnacceptableTokenCount('This handler accepts 1 token at most')try:start,end=[int(token)fortokenintokens[0].split('-')]exceptExceptionase:raiseUnacceptableToken('Couldn\'t process token {}, got {}'.format(tokens[0],e))return[iforiinrange(start,end)]

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
mysql如何正确安装MySQLConnector java?   java如何通过发送列表从数据库获取数据?   java将结束标记添加到HtmleElement(HtmlUnit)   java将多个高亮灯设置为一个窗格   java中比较器的使用   java如何访问servlet和下载附件?   未调用swing java绘制方法   Hibernate中映射实体的java问题   无法创建java SessionFactory和接口实现bean   java Hibernate从JTA转变为每个线程的延迟加载和会话   java日志伪造强化修复   CalendarView Android中的java更改fontfamily   java JSP Servlet getParameter给定null   安卓 Java:创建一个KML文件并在现有文件中插入元素   java当存在多个匹配证书时,如何选择SSL客户端证书?   exceljava。lang.ClassCastException:ExcelStreamAction无法强制转换为com。开放交响乐团。xwork2。行动   getter方法中的Java断言   java ShapeRenderer转换干扰LibGDX中的网格转换