arcletproject / alconna Goto Github PK
View Code? Open in Web Editor NEWA High-performance, Generality, Humane Python CLI Arguments Parser Library. 一个直观的、高性能、泛用的Python命令行参数解析器集成库
License: MIT License
A High-performance, Generality, Humane Python CLI Arguments Parser Library. 一个直观的、高性能、泛用的Python命令行参数解析器集成库
License: MIT License
命令组允许合并多个命令头相同的命令,或在设置命令组根命令后合并任意多个命令
验证器负责在参数验证的最后阶段调用,即可在类型转换后再进行验证
对于内置类型但又希望增加验证器的,可以提供一个函数:bind
,或使用typing.Annotated
来进行
命令补全可提供如下方式触发:
要求Args提供可能的CompletionSupplier, 生成补全信息(大概交给ArgsField)
暂无
暂无
有序:
Option("--test", Args["foo":"bar", "aaa":int:234], disorder=False) # default False
--test bar 666
√
--test 123 bar
X
无序:
Option("--test", Args["foo":"bar", "aaa":int:234], disorder=True)
--test bar 666
√
--test 123 bar
√
概要
当类有内部类时,该内部类解析为subcmd
是否已有相关实现
from arclet.alconna import AlconnaFire
class Test:
def __init__(self, user):
self.user = user
class Sub:
def subopt(self, name):
print(name)
alc = AlconnaFire(Test)
alc.parse("Test RF Sub subopt Hello")
其他内容
处理方式基本与外部类相同
alc 导出为 json ,并在必要时可以从 json 产生实例
暂无
暂无
泛匹配(可以的话
问题
Option在设置alias之后,analyse_message取得的Arpamar结果中取该Option本身的name结果为空,取alias本身时正确。
如何复现
参考控制台日志
预期行为
cmd_test.analyse_message('/test -h').help
Ellipsis
使用环境:
日志/截图
cmd_test = Alconna(
... command='/test',
... options=[
... Option('-help', alias='-h').help('获取帮助'),
... ],
... )
cmd_test.analyse_message('/test -h').h
Ellipsis
cmd_test.analyse_message('/test -h').help
(无输出)
a = Args["test":Bool:"True", "aaa":AnyStr:"bbb"]
类似argparse中的action,但可以加入元素相关操作
arp.query_args("$main”)
arp.query_value("foo")
概要
以Fire-Like
形式(即通过传入function、class等)构造Alconna.
是否已有相关实现
概要
当action为Coroutine时依然能够执行
其他内容
可能的方案:
概要
用类似于Click构造command的方式构造一个Alconna
是否已有相关实现
command_decorate = AlconnaDecorator()
@command_decorate()
@command_decorate.option("--foo", Args["bar":str])
def test(bar: str):
...
其他内容
1.该方式不支持传入多类命令头
2.该方式装饰的函数暂定为main_args_action
3.该方式或许有其他更简易的相关实现
2.0版本下,可能将抛弃Option
与Subcommand
,Args
概念
新概念 Node
:
是解析命令的最小单位。
应当是两个sep之间的字符串或者两个字符串之间的非字符单元。
可以选择先验匹配(提交几类固定值,解析器直接判断)或后验匹配(使用nepattern,解析器传入后分析解析结果,类似 Arg)。
新概念 Scope
:
由一到多个 Node
或 Scope 组成
可约束 Node
之间的 sep, 或继承其上层 Scope
的配置
Node
分配其子 Node
时自动以自身的 dest 创建一个 Scope
, 并让子节点加入
同一个 Scope
下不允许存在名字相同的两个节点 ( 同 dest 不影响)
Alconna 1.x 版本存在诸多设计问题和历史遗留问题,这些问题需要在 2.0 版本中进行集中解决。仓库主分支目前已在2.0-alpha2阶段,清理了部分冗余功能并且提出了一些2.0设计。此项目需要基于 Alconna 1.x 的基础设计进行 2.0 版本的项目设计与开发,并且需要将 Alconna 的上游基础组件库一并进行优化与设计迭代,这将涉及到对文本解析算法、系统架构、文字样式排版、语言底层原理的大量工作。
Alconna 2.0 主体架构
类型验证&类型转换组件库的性能优化,可使用cython或pyo3等方式
字符串分割组件的优化,例如使其可识别全角引号、识别自定义特殊符号等
更新样式组件库,可提供更多样式
Alconna 2.0 外部接口,需要总结 Alconna 1.x 版本现有的外部衍生项目,抽象成统一的对外功能接口,并尽可能提供具体实现
概要
Args的value处接受一个Iterable实例时, 会将其作为choice对象。解析时对应参数只能为choice内的其中一个参数,否则报错
是否已有相关实现
Args["part":["abc", "def"]]
其他内容
内部暂且不作其他判断
概要
即强化自动补全,目前想法为:
当消息传入时会在处理消息阶段报错
对于过滤元素的报错消息应当忽略
概要
class Alc:
main = Args[...]
opt1 = Option(...)
sub = Subcommand(...)
delegate(Alc).parse(...)
def my_converter(text:str):
return int(text)
with convert(my_converter, r"\d+") as int_:
args = Args["foo":int_]
或者是
@pattern("int_", r"\d+")
def my_converter(text:str):
return int(text)
...
args = Args["foo":"int_"]
args = Args["tag[3]":str]
概要
负责提供一个模版类,包括消息的获取规范与解析结果的处理规范
是否已有相关实现
main.py:
amp = DefaultAlconnaMessageProcessor(loop=loop)
alc = Alconna("command", main_args="foo:str").callback(lambda foo:foo)
amp.run()
AMP.py:
class AbstractAlconnaMessageProcessor:
async def fetch_message():
...
async def execute_handler():
...
其他内容
该内容随时可能被驳回
命令管理器的all_command_help可以返回原始的帮助数据而非排版好的帮助信息
暂无
暂无
命令创建时可以对命令管理器主动隐藏,从而在获取所有命令帮助时不显示
暂无
暂无
概要
类似pydantic,提供固定接口类"Config", 当Firelike解析到这个类时会优先以该类的内部类变量进行构造
大致提供如下:
概要
以下会作为0.6.5-0.7的更改内容
and more……
概要
1.from_dict()与to_dict()
这两个方法可用于pickle保存Alconna、从json生成Alconna等功能
2.commandline::analyse 与 create --analysed
analyse命令可以将传入的cmdstring转为一命令结构,create --analysed则会尝试获取之前analyse获取的命令结构并转为Alconna结构
概要
将非文字类型参数也作为ArgPattern内的pattern参数, 必要时还可以使其导入ObjectPattern.
其他内容
针对此种情况,PatternToken的
Direct -> 不验证类型
Match —> 验证类型
Transform —> 验证且转换为另一类型
Option("action", Argus(a=AnyStr, b=AnyStr).default(a="BBB"))
概要
1.re.pattern由ArgPattern生成
2.对于(.+), 考虑同AnyParam一样针对,即不经过re匹配
3.命令头部分也应存在一个pattern以防止大量重复构建pattern
是否已有相关实现
ArgPattern:
re_pattern: Pattern
def refind(self, mayarg: str):
return self.re_pattern.findall(mayarg)
概要
目前已有的格式适用于bot交互,
之后应提供适用于cli的help格式
形如:
TestCommand
Usage:
TestCommand <subcommand> [options]
Subcommand:
sub1 ……
sub2 ……
添加 async_parse
和 aysnc_execute
方法,
Option("--param", alias="-p")
自0.9.0开始,因为默认引入缓存机制,参数动作(ArgAction)会因为原先的解析时运行只会在某个命令首次解析时执行。
因此,考虑将Action的执行行为全权交给一个内置的Behavior
该Behavior的实现需要满足如下要求:
注:特殊的两个选项help
,shortcut
不受此影响
0.5.5
test = Alconna(command='/test', main_args=Args(num=int).default(num=1))
test.analyse_message('/test 10')
matched=True head_matched=True error_data=[] _options={} _other_args={} _main_args={'num': 10}
test.analyse_message('/test')
matched=False head_matched=True error_data=[''] _options={} _other_args={} _main_args={}
0.5.3
test = Alconna(command='/test', main_args=Args(num=int).default(num=1))
test.analyse_message('/test 10')
current_index=1 is_str=True results={'main_args': {'num': 10}} raw_data={} need_main_args=True matched=True head_matched=True _options={} _args={}
test.analyse_message('/test')
current_index=1 is_str=True results={'main_args': {'num': 1}} raw_data={} need_main_args=True matched=True head_matched=True _options={} _args={}
Args的"default"可以添加一个 Field
(like dataclasses.field
), 主要有alias
、default
和default_factory
暂无
暂无
-h
作为 --help
预设位,picupload -w 200 -h 200
此类命令不会按直觉解析,应该给予 Exception 或 提示 避免困惑。
Option("--width|-wi", Args['width', int], help_text="设置宽度"),
Option("--height|-he", Args['height', int], help_text="设置高度"),
Option("foo").help("Example")
概要
help_string存入TemplateCommand中,
get_help会调用各部分的help生成器
在此前版本中,Arpamar 仅作为解析结果载体,无法很好的与其他组件互通
为此,Arpamar 或许会进行如下调整:
概要
反向匹配中传入的正则或者类型在匹配成功时认为解析失败, 即用来排除特定参数
是否已有相关实现
Args["!path":".+/.+\.apk"]
概要
可用于设置快捷指令
即将一段字符串作为一个复杂命令的快捷方式
是否已有相关实现
github = Alconna(command="#github",options=[...])
cmd = "#github RimoChan repo yinglish"
github.shortcut("ying语仓库", cmd)
github.analyse_message("ying语仓库") # eq. github.analyse_message(cmd)
其他内容
1.shortcut有三个形参:
Alconna(command="give", main_argument={"sb":Default(AnyStr, None), "sth": Default(AnyStr, None)})
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.