MicroPython 是一种适用于微控制器和其他受限环境的 Python 编程语言的实现。它旨在提供与 Python 3 语言的紧密兼容,同时考虑到内存和计算资源的限制。MicroPython 库是这门语言的核心组成部分,提供了一系列的模块和函数,使得开发者能够在硬件上执行各种任务。
下面将通过系列文章,逐一解读microPython,以便让读者了解掌握microPython的整个核心逻辑.,以便读者可以透过这个Python的最小内核,掌握Python解析器的核心实现逻辑,学习世界上最优秀的源码设计.
#include <stdlib.h>
#include <assert.h>
#include "py/runtime.h"
/**
* 检查函数参数的数量和签名是否符合预期
*
* @param n_args 实际传入的参数数量
* @param n_kw 实际传入的关键字参数数量
* @param sig 函数签名,用于描述参数的数量和类型
*/
void mp_arg_check_num_sig(size_t n_args, size_t n_kw, uint32_t sig) {
// TODO 也许应该将函数名作为参数传递,以便我们可以打印更友好的错误信息
// MP_OBJ_FUN_MAKE_SIG 的反向操作
bool takes_kw = sig & 1;
size_t n_args_min = sig >> 17;
size_t n_args_max = (sig >> 1) & 0xffff;
if (n_kw && !takes_kw) {
#if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE
mp_arg_error_terse_mismatch();
#else
mp_raise_TypeError(MP_ERROR_TEXT("函数不接受关键字参数"));
#endif
}
if (n_args_min == n_args_max) {
if (n_args != n_args_min) {
#if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE
mp_arg_error_terse_mismatch();
#else
mp_raise_msg_varg(&mp_type_TypeError,
MP_ERROR_TEXT("函数需要 %d 个位置参数,但是给了 %d 个"),
n_args_min, n_args);
#endif
}
} else {
if (n_args < n_args_min) {
#if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE