Problem statement:

我有100s的py文件,它们定义了简单的模式.突然间,我需要将空字符串视为没有.我希望对所有文件进行最小程度的更改.

Approach I implemented:

我创建了一个继承类,比如

class ConstrainedStr(str):
        @classmethod
def __get_validators__(cls):
    yield cls.validate

@classmethod
def validate(cls, v: str, field: Field) -> Optional[str]:
    v = v.strip()
    if v == "":
        return None
    return v

然后,在所有的py文件中,我只添加了一条导入语句

from package.module import ConstrainedStr as str

幸运的是,它在第一眼就奏效了.但我最终遇到了一个问题,我有一个功能

User file:

from package.module import ConstrainedStr as str

def validate(cls, value:str): //sample value 'asd'
    if isinstance(value, str):
        validation_rule()

在这里,这个条件语句失败了.

Question

  1. 我如何才能避免为实现这一目标而做出重大改变?有什么办法吗?
  2. 实例判断失败的原因.Constrainedstr也是一个字符串,对吗?我的理解错了吗?

When I digged into this further,为了了解第二个问题的表现,我发现了以下几点.

type(ConstrainedStr) 

返还type<class>美元.

`type('123')` 

返回type<str>

但当我判断builtins包时,str也是一个类.但是type函数返回str的类型为str,而ConstrainedStr的类型为class.因此,我的第二个问题突然出现了.

另一个例子:

class A(int):
    pass

isinstance(2, A)
# False

这是我的第二个问题.

推荐答案

虽然子类的实例自动成为基类的实例,但反之亦然.这类似于每一只cat 都是哺乳动物,但并不是每一种哺乳动物都是cat .

类似地,因为ConstrainedStrstr的子类,所以子类ConstrainedStr的实例自动是基类str的实例,而相反地,诸如'asd'的基类str的实例不能自动被认为是诸如ConstrainedStr的子类的实例.

要强制反向实例判断也为真,您可以通过在元类上定义__instancecheck__来自定义isinstance的行为.还通过定义__subclasscheck___来定制issubclass以保持关系的一致性.

为了实现所需的行为,如果给定的实例是任何基类的实例,则自定义__instancecheck__应返回True:

class SubstitutableMeta(type):
    def __instancecheck__(cls, instance):
        return any(isinstance(instance, base) for base in cls.__bases__)

    def __subclasscheck__(cls, subclass):
        return any(issubclass(subclass, base) for base in cls.__bases__)

class ConstrainedStr(str, metaclass=SubstitutableMeta):
    pass

print(isinstance('asd', ConstrainedStr)) # outputs True

Python相关问答推荐

如何使用Google Gemini API为单个提示生成多个响应?

我在使用fill_between()将最大和最小带应用到我的图表中时遇到问题

如何使用symy打印方程?

仿制药的类型铸造

将数据框架与导入的Excel文件一起使用

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

NP.round解算数据后NP.unique

如何获得每个组的时间戳差异?

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

将scipy. sparse矩阵直接保存为常规txt文件

如何使用两个关键函数来排序一个多索引框架?

如何将泛型类类型与函数返回类型结合使用?

为什么dict. items()可以快速查找?

为什么后跟inplace方法的`.rename(Columns={';b';:';b';},Copy=False)`没有更新原始数据帧?

如何获取给定列中包含特定值的行号?

Django更新视图未更新

如何将验证器应用于PYDANC2中的EACHY_ITEM?

Python:在cmd中添加参数时的语法

Sknowled线性回归()不需要迭代和学习率作为参数