对函数部分或全部参数进行类型检查

Python函数可读性三重跃迁:命名、参数与类型设计 在Python数据科学工程中,函数可读性直接决定团队协作效率与IDE智能支持能力。其核心在于将函数从‘机器可执行’升级为‘人类可推演、工具可分析’的契约单元。原理上需完成三重跃迁:命名即契约,通过动词+宾语+限定条件结构消除语义歧义;参数即接口,采用仅关键字参数(keyword-only)保障调用意图明确、IDE补全精准;类型即文档,借助`TypedDict`、`Literal`等精确注解使静态分析成为可能。技术价值体现在降低理解成本、提升重构安全性和减少运行时错误。典型应用场景包括数据清洗、特征工程与模型 阅读详情

对函数部分或全部参数进行类型检查

构建一个装饰器,通过对装饰器中传入类型参数,来对装饰的函数的对应参数进行类型检查。

from inspect import signature
from functools import wraps

def typeassert(*tyargs,**tykwargs):
    def decorator(func):
        #获取指定的强制类型参数
        sig=signature(func)
        required_types=sig.bind_partial(*tyargs,**tykwargs).arguments#OrderedDict类型,可以只对前面的参数进行in搜索判定,可以把前面的参数当作key来获取对应的类型

        @wraps(func)
        def wrapper(*args,**kwargs):
            #获取函数输入的各参数类型
            input_vals=sig.bind(*args,**kwargs)

            #对输入的每个参数,如果出现在设定的类型检查中,则进行类型检查
            for name,value in input_vals.arguments.items():
                if name in required_types:
                    if not isinstance(value,required_types[name]):
                        raise TypeError(
                            'Argument {} must be {}'.format(name, required_types[name])
                            )
            return func(*args,**kwargs)
        return wrapper
    return decorator

@typeassert(str,z=int)#第一个位置参数为str,z必须为int
def func(x,y,z):
    return y+z

>>>print(func(1,2,3))
TypeError: Argument x must be <class 'str'>
    
@typeassert(int,y=str,z=int)#第一个位置参数为int,y为str,z必须为int
def func(x,y,z):
    print(x,y,z)
>>>func1(3,'s',1)
3 s 1
>>>func1('hhh','s',1)
TypeError: Argument x must be <class 'int'>

另外也可以通过函数注解来实现,之前实现过,代码如下:

def para_check(func):#外函数,传入的参数是待检验函数对象本身
    sig=inspect.signature(func)#获取函数参数签名
    parameters=sig.parameters#获取参数的有序字典
    arg_names=tuple(parameters.keys())#获取参数的名称
    def wrapper(*args,**kwargs):#内函数
        check_list=[]#待检验的参数对
        for i,val in enumerate(args):#检验所有的位置参数
            arg_name=arg_names[i]
            anno=parameters[arg_name].annotation#该参数期待的类型
            check_list.append((arg_name,anno,val))
        for arg_name,val in kwargs.items():#检验所有的关键字参数
            anno=parameters[arg_name].annotation
            check_list.append((arg_name,anno,val))

        for check_arg in check_list:#逐个参数检验
            if not isinstance(check_arg[2],check_arg[1]):
                raise TypeError('the input %s expect type %s,but got %s'%(check_arg[0],check_arg[1],type(check_arg[2])))
        return func(*args,**kwargs)
    return wrapper

@para_check
def test(x: int, y: int):
    return x + y
>>>print(test(1,2))
3
>>>print(test(1,'3'))
TypeError: the input y expect type <class 'int'>,but got <class 'str'>

后者不需要使用传参数的装饰器。但是明显前者更灵活,用前者进行类型检查,那么后面的函数注解就可以做其它事情而非类型检查了。

TensorFlow 训练多个loss函数技巧: 训练步骤,冻结部分层(freeze some scopes),从tensorboard检查问题 这两天使用TensorFlow训练一个多个损失函数的网络模型,自己搭建网络,调参训练,由于网络是一个两阶段的网络,具有三个损失函数,其中两个损失函数监督第一个阶段,一个损失函数家督第二个阶段,而且损失函数监督的并不全是最后一层,还有中间层,这需要调整我的训练方式。 训练方式 先分别训练第一阶段的两个损失函数 固定住第一阶段的网络的参数,只训练第二阶段网络参数 调整三个loss函数的正则化参... 阅读详情

相关推荐

JavaScript 默认参数与剩余参数:提升函数灵活性的技巧

JavaScript ES6函数参数处理新特性解析 本文深入探讨ES6引入的默认参数和剩余参数特性,对比传统实现方式的差异,并提供实际应用案例。主要内容包括:1) 默认参数基础语法与高级用法;2) 剩余参数处理不定数量参数的技巧;3) 两种特性的结合使用模式;4) 性能优化建议;5) React组件、API请求等实际应用场景。文章通过代码示例详细展示了参数解构、动态默认值、必填参数检查等进阶技巧,并分析了默认参数的独立作用域特性,为开发者提供全面的函数参数处理方案。

记录学习的过程 1108

类型注解和参数类型检查实现

python属于动态语言使用之前不需要事先定义,只有执行的时候才能直到变量的类型。 函数注解 Function Annotations python 3.5后增加语法 python3.5引入 对函数的参数进行类型注解 对函数的返回值进行类型注解 只对函数参数做一个辅助的说明,并不对函数参数进行类型检查 提供给第三方工具,做代码分析 函数的注解信息,保存在__annotations__属性中 d...

都枯槐的博客 467

葵花 Himawari 8/9号数据学习记录-01-数据初识

葵花卫星学习记录,第一章:卫星的来源与卫星数据的波段介绍

weixin_44111909的博客 539

一个可变参数类型检查的示例

最近在修正代码警告,发现封装的打印语句不会进行参数的类型检查,而用printf却是可以的。于是上网找了下资料,学习了一下。 对于函数参数类型的检查,在gcc环境中可以使用__attribute__((format(printf,N,M)))的形式。

李迟的专栏 2219

Fritzing0.9.10下载安装和简单使用

Fritzing 作为一款电子设计自动化软件,其画图用于导入到论文和文档,清晰好看,能解决用相机拍实物照片杜邦线很乱的痛点。

李同学Lino的博客 3万+

NVIDIA 2025 Board Design Engineer 校招笔试

电路分析,矩形波阶跃反馈驱动​,误差信号。非常简单,数电or​离散基础。第一题是考试规矩知情确认。大二暑假做的,纯体验​。五六题太长,下篇分享。

m0_74253823的博客 1130

容器中的参数类型检查

17.9.15:这几天看书速度太慢,一定要在28号之前把《Java编程思想》所有剩下的代码搞定。 这一小节比较简单,主要是了解新代码与Java SE5之前的代码兼容,早先的代码很多并不具备泛型这个概念,所以我们在和以往代码兼容时,需要注意这一点,有一些方法可以帮助我们解决这个问题:Collections中有一组静态方法——checkedCollection(),checkedList(),che...

可爱滴老唐 244

Claude Code 实战指南:用 AI 玩转终端编程,效率狂飙!

本文介绍了终端 AI 代理工具 Claude Code,涵盖常用命令、使用方法(如 init 初始化、权限配置、工作流程、上下文管理)、MCP 扩展工具及实战案例,展示其通过自然语言辅助开发的高效性与实用性。

个人技术 1万+

python 类型检查-Python中的类型检查

本文中所有代码均运行在Python 2.7上为什么要进行类型检查?总所周知,Python是一门典型的动态语言,在变量定义、使用的过程中遵循duck typing,当对某一变量进行操作时才去检查它是否支持该操作。这在大多数情况下没有什么问题。但有时我们希望当面对非法类型的参数的时候采取某些默认处理机制,来提高程序的健壮性,而不是直接抛出异常停掉整个程序。举个例子:def list_add(list1...

weixin_39613744的博客 381

内网渗透—横向移动&IPC横移&Impacket套件&CS插件

以上便是IPC横移的知识。最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。

2301_76227305的博客 1890

Transformer实战(30)——Transformer注意力机制可视化

在本节中,我们讨论了人工智能面临的最重要问题之一:可解释人工智能 (explainable artificial intelligence, XAI)。随着语言模型的不断发展,可解释性成为一个严峻的问题。本节中,我们从 Transformer 的角度出发,研究了 Transformer 架构中的自注意力机制,尝试通过各种可视化工具理解这些机制的内部过程。

盼小辉丶的博客 2651

函数的定义的四个注意部分,定义的两种方式及其分号结尾的情况,函数参数的2个关键字(arguments,rest),return正确写法

上述abs()函数的定义如下: function指出这是一个函数定义; abs是函数的名称; (x)括号内列出函数的参数,多个参数以,分隔; { ... }之间的代码是函数体,可以包含若干语句,甚至可以没有任何语句。 function abs(x) { if (x >= 0) { return x; } else { return -x; } } 如果没有return语句,函数执行完毕后也会返回结果,只是结果为undefined。由于

zz2230633069的博客 1821

/home 挂载点无法访问 怎么解决 指令可以进入Home目录 du: 无法访问“*“: 输入/输出错误

本文介绍了Linux系统中XFS文件系统损坏的故障排查与修复方法。当/home挂载点出现I/O错误时,通过dmesg发现XFS日志错误和磁盘I/O报错,判断可能是文件系统逻辑损坏或硬件故障。解决方案包括:1)尝试卸载分区;2)使用xfs_repair工具进行预检查和正式修复;3)在极端情况下使用-L参数强制清空日志;4)若存在硬件故障,建议优先进行数据抢救并更换硬盘。最后强调重要数据应先备份,再考虑系统重建。

专注于计算机研发知识和资讯分享 155

简单理解偏函数和部分应用函数

偏函数的概念在很多语音中都有,我们用scala中的偏函数来举例 部分应用函数 首先我们区分一下部分应用函数,部分应用函数就是一个函数有N个参数,我们提供小于N个参数的函数 例如下面的函数sum()它有3个参数 def sum(a:Int,b:Int,c:Int) = a + b + c; p_sum只有俩个参数,我们可以认为p_sum(2,3)=sum(1,2,3),p_sum就是一个部分应用函数 def p_sum = sum(1, _:Int, _:Int) 当我们的某一参数相同的..

qq_42456324的博客 492

行为预测模型:Social LSTM与Graph Neural Networks

行为预测模型:Social LSTM与Graph Neural Networks ,人工智能,计算机视觉,大模型,AI,本文围绕行为预测模型Social LSTM与Graph Neural Networks展开,介绍了两者的基础概念、原理、应用场景,还对比了它们在优势、劣势和适用场景上的不同,最后给出了相应的代码示例。Social LSTM基于LSTM,通过社交池化层处理多智能体交互;图神经网络处理图结构数据,靠消息传递获取信息,二者各有侧重,适用于不同场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

golang给函数参数设置默认值的几种方式(函数参数默认值)

这个问题相当麻烦,根据中的这篇文章,golang现在与将来都不会支持参数默认值。Go始终在使得自己变得尽可能的简单,而增加这种额外的支持会使parser变得更复杂。

学亮编程手记 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

scanf()函数的参数输入类型不匹配问题

http://blog.youkuaiyun.com/21aspnet/article/details/174326 scanf()函数的参数输入类型不匹配问题  这是我在csdn论坛上见到的问题,这个错误有时候会让人莫名其妙。  #include   main()  {  int a=123;  char c= 't ';  printf( "input/n "); 

xjgao75的专栏 7296

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

fuzzball.js API 完整参考手册:TypeScript 类型定义、全部选项与评分函数清单

fuzzball.js 是一个用于 **JavaScript 模糊字符串匹配(Fuzzy String Matching)** 的开源库,是 Python 库 fuzzywuzzy / TheFuzz 的 JS 移植版。本文是它的 **API 完整参考手册**:基于随包附带的 [TypeScript 类型定义文件](https://link.gitcode.com/i/3822b9f45a9e09

gitblog_01058的博客 986

excel怎么样将某列所有单元格中文本的非中文字符或数字或字母全部删除?

当我们要处理大量行数的excel数据时候,有时某列中有些行中的单元格内容中含有我们不想要的部分(比如包含一些特殊字符、数字、字母等等),这个时候我们想把这些不想要的部分删除,目前的excel没有相关的函数可以为我们解决这个问题,我们只能自己编写宏函数,实现这个功能,下面是一个功能很完备的宏函数,可以解决这个问题,大家可以直接复制代码到自己的文件中,也可以下载包含这个宏函数的文件,进行使用,宏文件包含多个常用的宏函数,并有详细介绍,大家可以根据需要使用。

石头的博客 5745

关于在c++中使用数组名作为函数参数,或者使用数组名的地址作为函数参数问题的一些研究

使用数组名作为函数参数,或者使用数组名的地址作为函数参数的一些问题的讨论。

wanglianda2007的博客 801

Gradualizer类型检查器实战:3种方式让Erlang代码在运行前捕获类型错误

Gradualizer 是一个面向 Erlang 的静态类型检查器,支持渐进式类型(gradual typing):它复用 Erlang 原生的 `-spec` 与 `-type` 语法,在代码运行之前通过静态类型分析捕获类型错误和分支遗漏。你写的类型标注越多,它检查得越严格——完全不加标注时则零侵入,不影响原有的动态类型风格。 本文将带你通过 **命令行、Rebar3 插件、Erlang Sh

gitblog_00318的博客 425

C++的泛型编程和限制参数类型的技术探讨

C++的泛型编程和限制参数类型的技术探讨 良少 2008-01-12 21:45:00 8817 收藏 展开 C++的泛型编程和限制参数类型的技术探讨 模板概述 泛型是C++中的重要特性。据说,已经在C++社区中已经取代面向对象成为C++的主要编程泛型。STL和boost库等都广泛使用了泛型。 泛型,就是C++的模板机制。 模板...

cxu123321的博客 1616

是否有标准函数检查JavaScript中的null,undefined或空白变量?

是否有通用的JavaScript函数可检查变量是否具有值并确保其undefined或为null ? 我有以下代码,但是不确定是否能涵盖所有情况: function isEmpty(val){

asdfgh0077的博客 855

CAPL_诊断函数<怎么检查各DTC中的各bit位>—第二部分

继上一篇第一部分中介绍,函数参数中的CheckID为想要检测的DTC的record number只能针对1个字节的有效。下面就优化一下,如果你的DTC的record number由几个字节组成,那么在参数中就需要把其他几个字节放进去就行,改成用diagGetRespParameterRaw来获得全部字节。以下用我要查的DTC是3个byte组成的,所以我在函数参数设置了3个checkID。其他跟上一篇文章一样。

@Mac的博客 578

C++编译期类型检查原理与实践指南

类型安全是编程语言的核心机制,通过编译期类型检查可以在代码转换为机器指令前捕获类型错误。其原理基于类型系统和模板元编程,利用static_assert、SFINAE和类型萃取等技术,在编译阶段验证类型约束。这种技术能有效预防隐式转换错误和类型滥用,特别适用于金融计算、跨模块接口等对类型敏感的场景。现代C++通过Type Anchoring和Concepts等特性,实现了零开销的类型安全方案。在实际工程中,结合类型锚定技术和编译期断言,可以构建强类型接口,避免类似财务精度误差或危险指针转换等问题。

weixin_34405557的博客 409
上一篇: 装饰器中添加参数
下一篇: python 模块导入详解
千翻娃儿
博客等级 码龄8年 5粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值