修复一些bug

This commit is contained in:
2025-09-20 03:39:51 +08:00
parent f1197d203b
commit 494bf300be
4 changed files with 51 additions and 107 deletions

View File

@@ -350,3 +350,25 @@ class DescriptiveIndicator[T]:
self.descripion : str = description
self.value : T = value
class Switch:
def __init__(self, value, isThougth = False) -> None:
self.value = value
self.isThougth = False
self.caseStats = False
self.result = None
def Case(self, caseValue, callback:Callable[[], Any]) -> 'Switch':
if self.caseStats and self.isThougth:
self.result = callback()
elif caseValue == self.value:
self.caseStats = True
self.result = callback()
return self
def Default(self, callback:Callable[[], Any]) -> Any:
if self.caseStats and self.isThougth:
self.result = callback()
elif self.caseStats == False:
self.caseStats = True
self.result = callback()
return self.result

View File

@@ -77,7 +77,10 @@ class ToolFile(BaseModel):
self,
filePath: Union[str, Self],
):
super().__init__(OriginFullPath=os.path.abspath(os.path.expandvars(str(filePath))))
filePath = os.path.expandvars(str(filePath))
if filePath[1:].startswith(":/") or filePath[1:].startswith(":\\"):
filePath = os.path.abspath(filePath)
super().__init__(OriginFullPath=filePath)
def __del__(self):
pass
def __str__(self):
@@ -89,9 +92,15 @@ class ToolFile(BaseModel):
def __or__(self, other):
if other is None:
return ToolFile(self.GetFullPath() if self.IsDir() else self.GetFullPath()+"\\")
return ToolFile(self.GetFullPath() if self.IsDir() else f"{self.GetFullPath()}\\")
else:
return ToolFile(os.path.join(self.GetFullPath(), str(other)))
# 不使用os.path.join因为os.path.join存在如下机制
# 当参数路径中存在绝对路径风格时,会忽略前面的参数,例如:
# os.path.join("E:/dev", "/analyze/") = "E:/analyze/"
# 而我们需要的是 "E:/dev/analyze"
first = self.GetFullPath().replace('/','\\').strip('\\')
second = str(other).replace('/','\\')
return ToolFile(f"{first}\\{second}")
def __idiv__(self, other):
temp = self.__or__(other)
self.OriginFullPath = temp.GetFullPath()
@@ -114,15 +123,15 @@ class ToolFile(BaseModel):
other_path = other.GetFullPath() if isinstance(other, ToolFile) else str(other)
self_path = self.OriginFullPath
# 标准化路径,移除末尾的斜线
if self_path.endswith('/') or self_path.endswith('\\'):
self_path = self_path[:-1]
if other_path.endswith('/') or other_path.endswith('\\'):
other_path = other_path[:-1]
# 使用系统的路径规范化函数进行比较
return os.path.normpath(self_path) == os.path.normpath(other_path)
# 如果两个文件都存在,则直接比较路径
if self.Exists() == True and other.Exists() == True:
return self_path.strip('\\/') == other_path.strip('\\/')
# 如果一个文件存在另一个不被判定为存在则一定不同
elif self.Exists() != other.Exists():
return False
# 如果两个文件都不存在,则直接比较文件名在视正反斜杠相同的情况下比较路径字符串
else:
return self_path.replace('/','\\') == other_path.replace('/','\\')
def ToPath(self):
return Path(self.OriginFullPath)

View File

@@ -237,15 +237,15 @@ pip install pyinstaller
pyinstaller --onefile --name convention-tool your_main_script.py
```
## 📄 许可证
## 许可证
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。
## 👨‍💻 作者
## 作者
**LiuBai** - [NINEMINEsigma](https://github.com/NINEMINEsigma)
## 🔗 相关链接
## 相关链接
- [Convention-Template](https://github.com/NINEMINEsigma/Convention-Template) - 项目模板规范
- [GitHub Issues](https://github.com/NINEMINEsigma/Convention-Python/issues) - 问题反馈

View File

@@ -2,95 +2,8 @@ import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from Convention.Runtime.Asynchrony import *
from Convention.Runtime.File import *
class Test(Asynchronous):
a:int
b:int
c:int
def __init__(self):
super().__init__(c={"timeout":2},b={"timeout":10})
self.a = 1
async def seta(obj:Test, value:int, delay:float = 1) -> None:
await asyncio.sleep(delay)
obj.a = value
async def setb(obj:Test, value:int, delay:float = 1) -> None:
await asyncio.sleep(delay)
obj.b = value
async def setc(obj:Test, value:int, delay:float = 1) -> None:
await asyncio.sleep(delay)
obj.c = value
async def run():
print("=== 测试优化后的异步字段系统 ===")
test = Test()
# 测试字段状态检查
assert test.is_field_initialized('a')
assert not test.is_field_initialized('b')
assert not test.is_field_initialized('c')
print("\n=== 测试1未设置值的情况应该超时===")
try:
print(f"失败: {test.a,test.b,test.c}")
raise RuntimeError("测试1应该超时")
except Exception as e:
print(f"成功: {e}")
print("\n=== 测试2在超时前设置字段b的值 ===")
# 创建新的测试实例
test2 = Test()
assert not test2.is_field_initialized('b')
# 启动并发任务设置b的值和获取b的值
# 并发执行设置b值延迟0.5秒和获取b值
await asyncio.gather(
setb(test2, 42, delay=0.5), # 0.5秒后设置b=42
return_exceptions=True
)
assert test2.b == 42
assert test2.is_field_initialized('b')
assert test2.b == 42
test3 = Test()
test3.b = 100
assert test3.is_field_initialized('b')
assert test3.b == 100
print("\n=== 测试3测试字段c短超时应该仍然超时===")
try:
print(f"失败: {test.c}")
except TimeoutError as timeout_e:
print(f"成功: {timeout_e}")
def test_sync_access():
"""测试同步访问(在非异步上下文中)"""
print("\n=== 测试同步访问 ===")
test = Test()
# 测试已初始化字段的同步访问
try:
print(f"成功: a = {test.a}")
except Exception as e:
raise
# 测试未初始化字段的同步访问(应该有更友好的错误提示)
try:
print(f"失败: c = {test.c}")
raise RuntimeError("字段c此时不应该能够被访问")
except Exception as e:
print(f"成功: {e}")
if __name__ == "__main__":
# 测试同步访问
test_sync_access()
# 测试异步访问
print("\n=== 开始异步测试 ===")
run_until_complete(run())
first = ToolFile("E:/dev/")
second = ToolFile("/analyze/")
print(first|second)