samoyed package

Submodules

samoyed.core module

class samoyed.core.Context(names: Optional[dict] = None, dollar_names: Optional[Dict[str, str]] = None)[source]

Bases: object

上下文

__init__(names: Optional[dict] = None, dollar_names: Optional[Dict[str, str]] = None)[source]

Notes

绑定内置函数,变量,外部传入的参数到内部的参数表中。 对于外部传入的dollar_names,如果有包含名字叫mg的方法会被过滤掉

Parameters
  • names – 外部传入的变量表

  • dollar_names – 传入的参数

is_exit() bool[source]

判断当前程序是否已经退出 :returns: 当前程序是否已经退出 :rtype: bool

set_exit() None[source]

设置当前程序退出

class samoyed.core.Interpreter(code: Union[str, lark.tree.Tree], context: Optional[dict] = None, args: Optional[dict] = None, dont_init=False)[source]

Bases: object

解释器类

__init__(code: Union[str, lark.tree.Tree], context: Optional[dict] = None, args: Optional[dict] = None, dont_init=False)[source]
Parameters
  • code (Union[str, lark.Tree]) – 代码

  • context (dict) – 额外的上下文

  • args (dict) – 命令行等特殊参数

  • dont_init (bool) – 是否执行初始化

_match_value(value1: Union[int, float, bool, None, str], value2: Union[int, float, bool, None, str, re.Pattern]) Tuple[bool, Optional[re.Match]][source]

判断节点的值是否匹配 如果是正则匹配会返回匹配结果 :param value1: 要匹配的值 :param value2: 匹配的值2,可以是正则表达式。判断value1是否满足正则表达式的pattern

Returns

  • bool 匹配是否成功

  • result 匹配结果

arith_operator = {'%': <built-in function mod>, '*': <built-in function mul>, '+': <function mock_add>, '-': <built-in function sub>, '/': <built-in function truediv>, '//': <built-in function floordiv>}
compare_operator = {'!=': <built-in function ne>, '<': <built-in function lt>, '<=': <built-in function le>, '==': <built-in function eq>, '>': <built-in function gt>, '>=': <built-in function ge>}
exec() None[source]

解释执行程序

exec_statement(stat: lark.tree.Tree) None[source]

执行每一个语句 可执行的语句有以下几种: * simple_stmt 简单的语句,包括赋值表达式,跳转表达式,pass表达式和普通表达式 * if_stmt if语句 * match_stmt 包括普通的match和可以控制输入时间的match

Parameters

stat – 语句的语法分析结果

Raises
f = <_io.TextIOWrapper name='/home/docs/checkouts/readthedocs.org/user_builds/samoyed/checkouts/latest/samoyed/samoyed.gram' mode='r' encoding='UTF-8'>
get_expression(expr: Union[lark.tree.Tree, lark.lexer.Token, numbers.Number, str]) Union[int, float, bool, None, str, function][source]

获取表达式的值

Parameters

表达式树 (expr) –

Returns

Return type

表达式运算后的结果。可能是常量,也可能是一个函数

Raises
init() None[source]

执行所有外部的语句 外部的语句指下面这种情况: x = 1 state main:

pass

这里x=1就是外部的语句

parser = Lark(open('<string>'), parser='lalr', lexer='contextual', ...)
static reduce(l: list) Optional[numbers.Number][source]

计算形如数值、函数混合列表的值 大致原理是,分为奇数位和偶数位进行计算。 奇数位都是操作数,偶数为都是操作符。

Parameters

l – 操作数和操作符的序列,形如[1,+,2,-,3]

Returns

Return type

运算结果

Raises
transformer = <samoyed.core.SamoyedTransformer object>
class samoyed.core.SamoyedIndenter[source]

Bases: lark.indenter.Indenter

间隔控制 会将若干空格转换_INDENT终结符 如果空格数量不同,转换出的_INDENT也会不同

CLOSE_PAREN_types = []
DEDENT_type = '_DEDENT'
INDENT_type = '_INDENT'
NL_type = '_NEWLINE'
OPEN_PAREN_types = []
indent_level: List[int]
paren_level: int
tab_len = 4
class samoyed.core.SamoyedTransformer[source]

Bases: lark.visitors.Transformer

基础的语法制导,只会转换一些常量。

DOLLAR_VAR(value: lark.lexer.Token)[source]
FLOAT(value: lark.lexer.Token) float[source]
INT(value: lark.lexer.Token) int[source]
STR(value: lark.lexer.Token) str[source]
false(_)
none(_)
true(_)

samoyed.exception module

exception samoyed.exception.SamoyedException(message: Optional[str] = None, pos: Optional[Tuple[int, int]] = None)[source]

Bases: Exception

异常基类

exception samoyed.exception.SamoyedInterpretError(message: Optional[str] = None, pos: Optional[Tuple[int, int]] = None)[source]

Bases: samoyed.exception.SamoyedException

解释时出现的错误基类

exception samoyed.exception.SamoyedNameError(message: Optional[str] = None, pos: Optional[Tuple[int, int]] = None)[source]

Bases: samoyed.exception.SamoyedRuntimeError

名字错误

exception samoyed.exception.SamoyedNotFoundEntrance(*args, **kwargs)[source]

Bases: samoyed.exception.SamoyedInterpretError

未找到入口异常

exception samoyed.exception.SamoyedNotImplementError(*args, **kwargs)[source]

Bases: samoyed.exception.SamoyedInterpretError

未实现方法异常

exception samoyed.exception.SamoyedRuntimeError(message: Optional[str] = None, pos: Optional[Tuple[int, int]] = None)[source]

Bases: samoyed.exception.SamoyedException

运行时错误基类

exception samoyed.exception.SamoyedSyntaxError(expected: List[str], t: lark.lexer.Token, pos=None)[source]

Bases: samoyed.exception.SamoyedInterpretError

普通格式错误

TOKEN_TO_CHINESE = {'$END': 'EOF', 'COMMA': '逗号', 'COMMENT': '注释', 'DOLLAR_VAR': '$变量', 'FLOAT': 'float', 'INT': 'int', 'LESSTHAN': '<=', 'LETTER': '字符', 'LONG_STRING': '跨行字符串', 'MINUS': '-', 'MORETHAN': '>=', 'NAME': '标识符名称', 'PLUS': '+', 'QMARK': '?', 'SLASH': '/', 'STAR': '*', 'STR': 'str', 'STRING': '字符串', '_INDENT': '缩进', '_NEWLINE': '换行'}
exception samoyed.exception.SamoyedTimeout(message: Optional[str] = None, pos: Optional[Tuple[int, int]] = None)[source]

Bases: samoyed.exception.SamoyedRuntimeError

执行超时

exception samoyed.exception.SamoyedTypeError(message: Optional[str] = None, pos: Optional[Tuple[int, int]] = None)[source]

Bases: samoyed.exception.SamoyedRuntimeError

类型错误

samoyed.libs module

内置函数

class samoyed.libs.TimeControl(func, max_wait, min_wait=None, timeout_interval=0.2, sleep_interval=0.2)[source]

Bases: object

返回一个可调用对象,调用该对象会进行延迟 如果主线程先结束,那么会取消计时器; 否则,计时器会杀死主线程

__call__(*args, **kwargs)[source]

调用函数

Raises

SamoyedRuntimeError

__init__(func, max_wait, min_wait=None, timeout_interval=0.2, sleep_interval=0.2)[source]

初始化 :param func: 要定时的函数 :param max_wait: 最大等待 :param min_wait: 至少等待时间 :param timeout_interval: 函数执行最大周期 :param sleep_interval: 每循环停顿周期

cancel() None[source]

撤销两个定时器线程

max_wait_handler(event: threading.Event)[source]

定时器将信号量置位

min_wait_handler(event: threading.Event)[source]

定时器将信号量置位

samoyed.libs.arg_option_add(l: List[Tuple[str, Optional[str], Optional[str]]], full_name: str, shortcut: Optional[str] = None, help_msg: Optional[str] = None)[source]

添加可选参数 :param l: 一个列表 :param full_name: 参数名全称 :param shortcut: 参数名缩写 :param help_msg: 帮助信息

samoyed.libs.arg_seq_add(l: List[Tuple[str, Optional[str]]], name: str, help_msg: Optional[str] = None)[source]

添加顺序参数 :param l: 一个列表 :param name: 参数名 :param help_msg: 帮助信息

samoyed.libs.make_arg_parser(pos_arg: Optional[List[Tuple[str, Optional[str]]]] = None, option_arg: Optional[List[Tuple[str, Optional[str], Optional[str]]]] = None, helping_message: Optional[str] = None)[source]

创建一个模式化的命令行参数处理程序 :param pos_arg: 顺序参数,传入的列表内保存2维元组

元组第一个参数是命令行参数名字 第二个参数是帮助信息

Parameters
  • option_arg – 可选参数,传入的列表内保存3维元组 元组第一个参数是命令行参数全称 第二个参数是简写 第三个参数是帮助信息

  • helping_message – 全局帮助信息

Returns

Return type

一个命令行参数解析器

samoyed.libs.mock_add(a: Optional[Union[int, float, bool, str]], b: Optional[Union[int, float, bool, str]]) Optional[Union[int, float, str]][source]

解释器内部使用的加法 python内置的add不支持字符串和数字加法。 这里允许进行这样的操作

Parameters
  • a – 参数a

  • b – 参数b

Returns

Return type

a+b的结果

samoyed.libs.sqlite(conn2curosr: Dict[sqlite3.Cursor, sqlite3.Connection], cursor: sqlite3.Cursor, sql: str) Union[None, List[Any]][source]

执行一条sql指令。 注意,由于脚本语言不支持列表,因此这里把返回结果全部转化成了字符串 :param conn2curosr: 用于绑定cursor和connection的一个字典 :param cursor: 执行指令的cursor :param sql: sql指令

Returns

Return type

sql的结果

samoyed.libs.sqlite_connect(conn2curosr: Dict[sqlite3.Cursor, sqlite3.Connection], db_name: str) sqlite3.Cursor[source]

建立一个sql连接 :param conn2curosr: 用于绑定cursor和connection的一个字典 :param db_name: 数据库名

Returns

Return type

一个cursor对象

samoyed.utils module

samoyed.utils.delete_pipe(name: str) None[source]

删除一个管道

Parameters
  • name – 管道路径

  • -------

samoyed.utils.get_pipe_read_end(name: str) -> (<class 'int'>, typing.Callable)[source]

获取管道的读取端函数 :param name: 管道名 :return: 读取函数

samoyed.utils.get_pipe_write_end(name: str) Callable[source]

获取管道的写入端函数 :param name: 管道名 :return: 写入函数

samoyed.utils.make_pipe(name: str, buffer_size=8192) None[source]

生成一个具名管道 :param name: 管道位置和名字 :param buffer_size: 缓存大小

Returns

Return type

文件描述符

samoyed.utils.watchdog(seconds=0.1)[source]

看门狗装饰器

seconds间隔后会抛出异常中断程序的执行,防止程序超时

Parameters

seconds – 最大执行时间

Returns

Return type

装饰的函数

Module contents