python - 针对动态创建的对象进行类型检查
问题描述
我想对方法的输入和输出执行一些动态类型检查。我想出的解决方案如下。基本上,在__init__
超类的函数中,我通过对输入和输出的一些动态类型检查来更新子类方法。请注意,类型检查应基于AlgorithmAttribute
用户在实例化期间定义的属性 ( )。我想知道是否有更好的解决方案。
import abc
import six
import attr
from typing import Dict, Text
@attr.s
class AlgorithmAttribute(object):
inputs = attr.ib(type=Dict[Text, int])
outputs = attr.ib(type=Dict[Text, int])
class BaseHandler(six.with_metaclass(abc.ABCMeta, object)):
def __init__(self, alg):
self.alg = alg
self.out = self.__getattribute__('prepare')
self.__setattr__('prepare', self.temp)
def temp(self, a, b):
result = self.out(a, b)
# Verifies inputs.
if set(a.keys()) == set(self.alg.inputs.keys()):
print('Inputs correct!')
# Verifies outputs.
if set(result.keys()) == set(self.alg.outputs.keys()):
print('Outputs correct!')
return result
@abc.abstractmethod
def prepare(self, a):
pass
class SubHandler(BaseHandler):
def __init__(self, alg):
super(SubHandler, self).__init__(alg)
def prepare(self, a:Dict[Text, int], b:Dict[Text, int]) -> Dict[Text, int]:
return {'c': 33}
alg = AlgorithmAttribute(inputs={'a': 2, 'b': 3}, outputs={'c': 10})
sh = SubHandler(alg)
sh.prepare({'a': 20, 'b': 200}, b={'c': 20, 'd': 200})
解决方案
我不太清楚为什么要验证prepare()
反对的第一个参数,inputs
或者将具有未使用值的 dict 传递给的意义何在AlgorithmAttribute
,但在我看来,一种更 Pythonic 的方式是放弃类并使用装饰器:
from dataclasses import dataclass
from typing import Dict, Text
@dataclass
class AlgorithmAttribute(object):
inputs: Dict[Text, int]
outputs: Dict[Text, int]
def validate_inputs_outputs(validation_params: AlgorithmAttribute):
def wrap(func):
def wrapped_func(*args, **kwargs):
result = func(*args, **kwargs)
# Verifies inputs.
if set(args[0].keys()) == set(validation_params.inputs.keys()):
print('Inputs correct!')
# Verifies outputs.
if set(result.keys()) == set(validation_params.outputs.keys()):
print('Outputs correct!')
return result
return wrapped_func
return wrap
@validate_inputs_outputs(AlgorithmAttribute(inputs={'a': 2, 'b': 3}, outputs={'c': 10}))
def prepare(a:Dict[Text, int], b:Dict[Text, int]) -> Dict[Text, int]:
return {'c': 33}
prepare({'a': 20, 'b': 200}, b={'c': 20, 'd': 200})
推荐阅读
- java - 如何使用 springboot-data-couchbase 配置多个 couchbase 数据源?
- ios - 歌曲仅在高级 Spotify 帐户中播放
- laravel - 如何使用两行在单个刀片中显示多个帖子(例如起始帖子、过期日期帖子)
- assembly - 装配中立即超出范围
- angular - BehaviorSubject 部分更改不会触发订阅
- ipython - IPython 选项卡完成菜单颜色不可读
- javascript - 单击按钮克隆表后添加一条水平线
- kubernetes - 如何在 k8s 上公开自定义端口?
- suitetalk - 如何通过传递 recordType 和 internalId 在 suitetalk 中获取客户记录的 URL
- c# - ReactJS 页面中的 SignalR 仅适用于重新加载