Python中文
首页
教程
问答
标签
搜索
登录
注册
检查函数参数类型是Pythonic吗?
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>我知道,在Python中,类型检查函数参数通常是不受欢迎的,但是我想我已经找到了这样做有意义的情况。</p> <p>在我的项目中,我有一个抽象基类<code>Coord</code>,它有一个子类<code>Vector</code>,它有更多的特性,如旋转、改变幅度等。数字的列表和元组也将返回True,因为<code>isinstance(x, Coord).</code>我还有很多函数和方法接受这些协调类型作为参数。我已经设置了decorators来检查这些方法的参数。以下是一个简化版本:</p> <pre><code>class accepts(object): def __init__(self, *types): self.types = types def __call__(self, func): def wrapper(*args): for i in len(args): if not isinstance(args[i], self.types[i]): raise TypeError return func(*args) return wrapper </code></pre> <p>这个版本很简单,仍然有一些错误。只是为了说明这一点。它的用途如下:</p> <pre><code>@accepts(numbers.Number, numbers.Number) def add(x, y): return x + y </code></pre> <p>注意:我只检查抽象基类的参数类型。</p> <p>这是个好主意吗?有没有更好的方法来做到这一点,而不必在每个方法中重复类似的代码?</p> <p><strong>编辑:</strong></p> <p>如果我要做同样的事情,但不是在decorator中预先检查类型,而是在decorator中捕获异常:</p> <pre><code>class accepts(object): def __init__(self, *types): self.types = types def __call__(self, func): def wrapper(*args): try: return func(*args) except TypeError: raise TypeError, message except AttributeError: raise AttributeError, message return wrapper </code></pre> <p>这样更好吗?</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>如果这是规则的例外,没关系。但是,如果项目的工程/设计围绕着类型检查每个函数(或大多数函数),那么也许您不想使用Python,那么用C#代替它怎么样?</p> <p>根据我的判断,你制作一个用于类型检查的decorator通常意味着你将大量使用它。因此,在这种情况下,虽然将公共代码分解成decorator是pythonic,但用于类型检查的事实并不是非常pythonic。</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
执行动态python函数以响应httpc
5 回答
执行包含USE statemens的批处理时出现“Invalid cursor state”错误
3 回答
执行包含日志的python脚本时,popen返回错误
1 回答
执行包含来自Linux终端的子进程的Pyqt5GUI会导致GUI中出现黑屏并冻结i
7 回答
执行包含自定义转换器的代码时出现问题?
10 回答
执行半取整
1 回答
执行单元测试时出现Python类型错误
9 回答
执行单击操作,处理当前页面并返回StaleElementReference selenium Python
1 回答
执行单独的、嵌套的if语句是否有效?
5 回答
执行双线性变换的代码不起作用
8 回答
执行反向BWT时,Python列表索引超出范围
8 回答
执行发电机db功能的单元测试
4 回答
执行另一个python脚本并获得输出
2 回答
执行只考虑timeseries数据帧中的上一年的pct\U change()?
8 回答
执行可能不友好的python cod
10 回答
执行各向异性扩散的Python代码,无法在Anacond中运行它
6 回答
执行合并后在dataframe中创建新列
9 回答
执行合并排序时出现逻辑错误
3 回答
执行合并联接列的外部联接
8 回答
执行同一代码时的不同值
7 回答