This commit is contained in:
2025-03-10 15:10:03 +08:00
parent cb388ce6b3
commit 527dad1dc7
17763 changed files with 13421 additions and 1 deletions
View File
+38
View File
@@ -0,0 +1,38 @@
import os
import platform
import re
host_window = r'C:\Windows\System32\drivers\etc\hosts'
host_mac = r'/etc/hosts'
HOST_LIVE = ['#dcalc', '127.0.0.1:17173 www.dcalc.com']
def search_host(hostvalue):
if platform.system().lower() != 'windows':
host_path = host_mac
else:
host_path = host_window
hostfile = open(host_path, 'r', errors='ignore')
each_line = hostfile.readlines()
hostfile.close()
findresult = re.findall(hostvalue, ''.join(each_line))
return findresult
def write_host(hostvalue):
if platform.system().lower() != 'windows':
output = open(host_mac, 'a')
else:
output = open(host_window, 'a')
for insid in hostvalue:
output.write(insid)
output.write('\n')
output.close()
def host_init():
if not search_host(HOST_LIVE[0]):
write_host(HOST_LIVE)
+30
View File
@@ -0,0 +1,30 @@
# 用于实现排行的最小堆
from heapq import heapify, heappush, heappushpop
class MinHeap:
def __init__(self, top_n, h=[]):
self.h = h[:]
self.length = top_n
heapify(self.h)
def add(self, element):
if len(self.h) < self.length:
heappush(self.h, element)
else:
heappushpop(self.h, element)
def getTop(self):
return sorted(self.h, reverse=True)
def merge(self, other):
"""
合并另一个堆
@type other MinHeap
"""
for elem in other.h:
self.add(elem)
def reset(self):
self.h = []
heapify(self.h)
+182
View File
@@ -0,0 +1,182 @@
from copy import copy
from dataclasses import Field
import re
from typing import dict
from typing_extensions import Self
class Store:
def __init__(self, initState: dict[str, Field] = {}):
self.__states: dict[str, Field] = initState.copy()
self.last_state = None
pass
# 设置值
def set(self, key: str, value: any):
field = self.__get_field__(key)
field.setValue(value)
return self
# 获取值
def get(self, key: str, defaultValue: any = None):
field = self.__get_field__(key)
_value = field.getValue()
if _value is None:
_value = defaultValue
return _value
def __getitem__(self, __key: str):
return self.get(__key)
# 获取一个克隆值
def clone(self, key: str, defaultValue: any = None):
value = self.get(key, defaultValue)
return copy(value)
# 主动通知变化
def emit(self, key: str, value: any = None):
field = self.__get_field__(key)
field.emit(value)
return self
# 找到首个不为空的值
def first(self, *names):
value = None
for name in names:
value = self.get(name)
if value is not None:
break
return value
# 计算属性
def compute(self, key: str, getter, setter=None):
field = self.__get_field__(key)
field.apply(setter)
field.getter = getter
return self
# 获取值并设置值
def use(self, key: str, handle):
if callable(handle):
value = handle(self.get(key))
self.set(key, value)
return self
# 批量修改整个集合
def convert(self, key: str, handle):
return self.use(key, lambda value: list(map(handle, value)))
# 绑定对象的属性
def bind(self, obj: object, name: str, key=None, defaultValue: any = None):
def getter():
return getattr(obj, name)
def setter(value):
setattr(obj, name, value)
# 如果属性不存在 则初始化
if hasattr(obj, name) is False or defaultValue is not None:
setattr(obj, name, defaultValue)
return self.compute(key, getter, setter)
# 根据指定的条件删除
def delete(self, pattern=None):
def match(_):
return True
if pattern is not None:
if callable(pattern):
match = pattern
elif isinstance(pattern, str):
def match(s):
return re.match(pattern, s)
keys = list(filter(match, self.__states.keys()))
for key in keys:
self.__states.pop(key)
return self
# 根据指定的条件导出
def exports(self, match=lambda _: True):
result = {}
for key in self.__states.keys():
if match(key):
result[key] = self.get(key)
return result
# 导入
def imports(self, pairs: dict = {}, prefix=''):
for key in pairs.keys():
self.set(prefix + str(key), pairs[key])
return self
def copy(self) -> Self:
return Store(self.__states)
# 只读属性
def const(self, key: str, value: any):
return self.compute(key, lambda: value)
# 监听值的变化
def watch(self, key: str, valueChanged):
return self.compute(key, None, valueChanged)
def linstener(self, key: str):
def change(value):
self.set(key, value)
pass
return change
def __get_field__(self, key: str):
field = None
if re.search(r'\{\w+\}', key):
key = key.format_map(self)
if self.__states.__contains__(key):
field = self.__states[key]
else:
field = Store.Field()
self.__states[key] = field
self.last_state = (key, field)
return field
class Field:
def __init__(self, value=None):
self.__value = None
self.getter = None
self.valueChangeds = []
self.locked = False
self.setValue(value)
pass
def setValue(self, value):
if self.locked:
return
self.locked = True
self.__value = value
self.emit(value)
self.locked = False
return self
def getValue(self):
if callable(self.getter):
self.__value = self.getter()
return self.__value
def emit(self, value=None):
if value is None:
value = self.getValue()
for valueChanged in self.valueChangeds:
if callable(valueChanged):
valueChanged(value)
return
def apply(self, valueChanged):
if callable(valueChanged):
self.valueChangeds.append(valueChanged)
store = Store()
+58
View File
@@ -0,0 +1,58 @@
from numbers import Number
def is_number(num_str):
"""
判断数据是否为一个数字
:param num_str: 字符串对象
:return:
"""
"""
判断数据是否为一个数字
:param num_str: 字符串对象
:return: 布尔值 True 是一个数字 False 不是一个数字 None 本就是数值类型
"""
# 防止非字段类型类型输入报错
if isinstance(num_str, Number):
return None
elif not isinstance(num_str, str):
return False
if num_str.isdigit():
return True
# 对Float类型的数字进行判断
if num_str.count('.') == 1:
num_str_list = num_str.split('.')
left = num_str_list[0]
right = num_str_list[1]
if left.startswith('-') and left.count('-') == 1 and right.isdigit():
_left = left.split('-')[1]
if _left.isdigit():
return True
elif left.isdigit() and right.isdigit():
return True
# 负数判断
elif num_str.startswith('-'):
_left = num_str.split('-')[1]
if _left.isdigit():
return True
return False
def str_to_num(value, default=0, num_type=float):
"""
将字符串类型转化为数据类型
:param value: 需要转化的值,不一定需要是字符串类型
:param default: 设置转换失败返回数值,默认原值
:param num_type: 设置转换成的数据类型
:return:
"""
num_flag = is_number(value)
if num_flag:
return num_type(value)
elif num_flag is None:
return num_type(value)
return value if default is None else default