158 lines
3.9 KiB
Python
158 lines
3.9 KiB
Python
"""命令参数解析类
|
||
|
||
提供简单易用的命令参数解析功能
|
||
"""
|
||
|
||
import shlex
|
||
|
||
|
||
class CommandArgs:
|
||
"""命令参数解析类
|
||
|
||
提供方便的方法来处理命令参数
|
||
"""
|
||
|
||
def __init__(self, raw_args: str = ""):
|
||
"""初始化命令参数
|
||
|
||
Args:
|
||
raw_args: 原始参数字符串
|
||
"""
|
||
self._raw_args = raw_args.strip()
|
||
self._parsed_args: list[str] | None = None
|
||
|
||
def get_raw(self) -> str:
|
||
"""获取完整的参数字符串
|
||
|
||
Returns:
|
||
str: 原始参数字符串
|
||
"""
|
||
return self._raw_args
|
||
|
||
def get_args(self) -> list[str]:
|
||
"""获取解析后的参数列表
|
||
|
||
将参数按空格分割,支持引号包围的参数
|
||
|
||
Returns:
|
||
List[str]: 参数列表
|
||
"""
|
||
if self._parsed_args is None:
|
||
if not self._raw_args:
|
||
self._parsed_args = []
|
||
else:
|
||
try:
|
||
# 使用shlex来正确处理引号和转义字符
|
||
self._parsed_args = shlex.split(self._raw_args)
|
||
except ValueError:
|
||
# 如果shlex解析失败,fallback到简单的split
|
||
self._parsed_args = self._raw_args.split()
|
||
|
||
return self._parsed_args
|
||
|
||
@property
|
||
def is_empty(self) -> bool:
|
||
"""检查参数是否为空
|
||
|
||
Returns:
|
||
bool: 如果没有参数返回True
|
||
"""
|
||
return len(self.get_args()) == 0
|
||
|
||
def get_arg(self, index: int, default: str = "") -> str:
|
||
"""获取指定索引的参数
|
||
|
||
Args:
|
||
index: 参数索引(从0开始)
|
||
default: 默认值
|
||
|
||
Returns:
|
||
str: 参数值或默认值
|
||
"""
|
||
args = self.get_args()
|
||
if 0 <= index < len(args):
|
||
return args[index]
|
||
return default
|
||
|
||
@property
|
||
def get_first(self, default: str = "") -> str:
|
||
"""获取第一个参数
|
||
|
||
Args:
|
||
default: 默认值
|
||
|
||
Returns:
|
||
str: 第一个参数或默认值
|
||
"""
|
||
return self.get_arg(0, default)
|
||
|
||
def get_remaining(self, start_index: int = 0) -> str:
|
||
"""获取从指定索引开始的剩余参数字符串
|
||
|
||
Args:
|
||
start_index: 起始索引
|
||
|
||
Returns:
|
||
str: 剩余参数组成的字符串
|
||
"""
|
||
args = self.get_args()
|
||
if start_index < len(args):
|
||
return " ".join(args[start_index:])
|
||
return ""
|
||
|
||
def count(self) -> int:
|
||
"""获取参数数量
|
||
|
||
Returns:
|
||
int: 参数数量
|
||
"""
|
||
return len(self.get_args())
|
||
|
||
def has_flag(self, flag: str) -> bool:
|
||
"""检查是否包含指定的标志参数
|
||
|
||
Args:
|
||
flag: 标志名(如 "--verbose" 或 "-v")
|
||
|
||
Returns:
|
||
bool: 如果包含该标志返回True
|
||
"""
|
||
return flag in self.get_args()
|
||
|
||
def get_flag_value(self, flag: str, default: str = "") -> str:
|
||
"""获取标志参数的值
|
||
|
||
查找 --key=value 或 --key value 形式的参数
|
||
|
||
Args:
|
||
flag: 标志名(如 "--output")
|
||
default: 默认值
|
||
|
||
Returns:
|
||
str: 标志的值或默认值
|
||
"""
|
||
args = self.get_args()
|
||
|
||
# 查找 --key=value 形式
|
||
for arg in args:
|
||
if arg.startswith(f"{flag}="):
|
||
return arg[len(flag) + 1 :]
|
||
|
||
# 查找 --key value 形式
|
||
try:
|
||
flag_index = args.index(flag)
|
||
if flag_index + 1 < len(args):
|
||
return args[flag_index + 1]
|
||
except ValueError:
|
||
pass
|
||
|
||
return default
|
||
|
||
def __str__(self) -> str:
|
||
"""字符串表示"""
|
||
return self._raw_args
|
||
|
||
def __repr__(self) -> str:
|
||
"""调试表示"""
|
||
return f"CommandArgs(raw='{self._raw_args}', parsed={self.get_args()})"
|