繁体   English   中英

Python-如何建立参数化的字符串工厂

[英]Python - How to make a parametrized string factory

给定指定的模式/模板,从参数编译字符串并从字符串解析参数有什么好的配方或轻量级库?

在使用URI(文件路径,URL等)时,这特别有用。 一个人想要定义模板,以及任何需要的值转换器,并且能够

  1. 验证字符串是否遵守模板的规则
  2. 给定模板的参数产生 (即编译)字符串
  3. 从有效字符串中提取参数(即解析)

似乎是内置的string.Formatter有很多需要的东西(虽然不是参数提取的),但是URI编译和解析用例似乎很普通,如果还没有一个Go-to库供我使用,我会感到惊讶这个。

工作实例

我正在寻找可以做以下事情的东西

>>> ln = LinearNaming('/home/{user}/fav/{num}.txt',  # template
...                   format_dict={'user': '[^/]+', 'num': '\d+'},  
...                   process_info_dict={'num': int}  # param conversion
...                  )
>>> ln.is_valid('/home/USER/fav/123.txt')
True
>>> ln.is_valid('/home/US/ER/fav/123.txt')
False
>>> ln.is_valid('/home/US/ER/fav/not_a_number.txt')
False
>>> ln.mk('USER', num=123)  # making a string (with args or kwargs)
'/home/USER/fav/123.txt'
>>> # Note: but ln.mk('USER', num='not_a_number') would fail because num is not valid
>>> ln.info_dict('/home/USER/fav/123.txt')  # note in the output, 123 is an int, not a string
{'user': 'USER', 'num': 123}
>>>
>>> ####### prefix methods #######
>>> ln.is_valid_prefix('/home/USER/fav/')
True
>>> ln.is_valid_prefix('/home/USER/fav/12')
False  # too long
>>> ln.is_valid_prefix('/home/USER/fav')
False  # too short
>>> ln.is_valid_prefix('/home/')
True  # just right
>>> ln.is_valid_prefix('/home/USER/fav/123.txt')  # full path, so output same as is_valid() method
True
>>>
>>> ln.mk_prefix('ME')
'/home/ME/fav/'
>>> ln.mk_prefix(user='YOU', num=456)  # full specification, so output same as same as mk() method
'/home/YOU/fav/456.txt'

(以上示例使用https://gist.github.com/thorwhalen/7e6a967bde2a8ae4ddf8928f1c9d8ea5的 LinearNaming起作用。但是这种方法很丑陋,并且不使用string.Formatter。)

Werkzeug是用于制作Web应用程序的一组工具,它提供了许多处理url的功能。

例如:

url = "https://mywebsite.com/?location=paris&season=winter"

from werkzeug import urls

params = urls.url_parse(url).decode_query()
params['season']
>>> 'winter'

看一下:

https://werkzeug.palletsprojects.com/zh-CN/0.14.x/urls/

编辑:至于通用模板,flask工具集中的另一个库Jinja可能是一个不错的选择。

f弦也是这项工作的简单工具。

现在,您呈现的特定用例基本上是模板的组合,例如您在Jinja或f字符串中看到的模板,以及用于验证变量的正则表达式。 我不知道有什么比通过与LinearNaming库最终等同的事情更简单的方式来完成如此具体的事情的。 您需要调用一个函数(至少如果您不想猴子修补字符串类),需要定义正则表达式(否则该库无法区分模板中的重要字符,例如'/'),并且您需要传递变量名称/值对。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM