[英]Python - How to make a parametrized string factory
给定指定的模式/模板,从参数编译字符串并从字符串解析参数有什么好的配方或轻量级库?
在使用URI(文件路径,URL等)时,这特别有用。 一个人想要定义模板,以及任何需要的值转换器,并且能够
似乎是内置的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.