名称简化
cmdb.types.Int 这样名字太长,对用户来讲只需要记住最后一个字段即可
所以进行约定,cmdb.types 下的int 可以作为type的名称
模块一旦加载创建之后,这些类都会放在模块的全局字典中
到这里用户可以送入两种名称:
def get_instance(type:str, **option:dict): # 可以传递cmdb.types.IP 或者 IP
key = ",".join("{}={}".format(k,v) for k,v in sorted(option.items()))
key = "{}|{}".format(type,key)
print(key)
通过globals() 进行快速查找到当前模块的所有类
找到送进来的短名称
改进代码,将:
扫描二维码关注公众号,回复:
4654327 查看本文章
def get_class(type:str):
cls = classse_cache.get(type)
if cls:
return cls
m, c = type.rsplit('.', maxsplit=1)
mod = importlib.import_module(m)
cls = getattr(mod, c)
classse_cache[type] = cls
print('cls>>>>',cls)
if issubclass(cls, BaseType):
return cls
raise TypeError('hhhhh')
改为:
def get_class(type:str):
cls = classse_cache.get(type)
if cls:
return cls
m,c = type.rsplit('.', maxsplit=1)
print(m,c)
globals().get(type) # 获取全局名词空间
第一次加载的时候先去找cache,如果未命中,则向办法创建并加入
如果cache存在,那如何判断有想要的类?前提是必须加载才有作用
加入两个方法,将其加载到字典
构建inject函数
def inject():
for name,types in globals().items():
print(name,types)
# 运行函数
inject()
# 查看结果略
通过找到全局获取并判断是否在全局名词空间中,判断传递的信息是否符合当前