Python 3.x 在Python3.6+中引入的`uuu set_uname `方法中检查所有者类型;PEP-0487

Python 3.x 在Python3.6+中引入的`uuu set_uname `方法中检查所有者类型;PEP-0487,python-3.x,python-3.6,Python 3.x,Python 3.6,我想检查所有者类类型,并允许字段类属性与数据集类或其任何子类一起使用。也就是说,我希望其他开发人员不要意外地将字段类与任何不是数据集子类的其他类一起使用 似乎数据集尚未完全加载 打印(f“字段:{owner!r}…”的{name!r}) 显示所有者类是Dataset 但是,如果issubclass(所有者,数据集),那么代码在下一个语句中失败:,因为python仍然不知道类Dataset 类别字段: 定义设置名称(自身、所有者、名称): 打印(f“字段:{owner!r}的{name!r}…”

我想检查所有者类类型,并允许
字段
类属性与
数据集
类或其任何子类一起使用。也就是说,我希望其他开发人员不要意外地将
字段
类与任何不是
数据集
子类的其他类一起使用

似乎
数据集
尚未完全加载

打印(f“字段:{owner!r}…”的{name!r})
显示所有者类是
Dataset

但是,如果issubclass(所有者,数据集),那么代码在下一个语句中失败:,因为python仍然不知道类
Dataset


类别字段:
定义设置名称(自身、所有者、名称):
打印(f“字段:{owner!r}的{name!r}…”)
self.name=名称
如果issubclass(所有者、数据集):
引发异常(
f“仅将类{Field!r}与类{Dataset!r}….一起使用”
)
类数据集:
字段=字段()
预期运行时不会引发任何错误。但是相反,我得到的错误是

Field: 'field' of <class '__main__.Dataset'>...

NameError: name 'Dataset' is not defined
字段:“…的字段”。。。
NameError:未定义名称“Dataset”

> p>这是因为我们仍然在构建<代码>数据库< /代码>类,而它在全局范围内还不可用。我希望有人能想出一个更好的解决方案,但一个解决办法是增加一个不起任何作用的基类:

class _DatasetBase:
    pass

class Field:
    def __set_name__(self, owner, name):
        print(f"Field: {name!r} of {owner!r} ...")
        self.name = name
        if not issubclass(owner, _DatasetBase):
            raise Exception(
                f"Use the class {Field!r} only with class {Dataset!r}...."
            )

class Dataset(_DatasetBase):
    field = Field()

每个字符串前面的
f
是什么(去掉它会删除错误)。@goodvibration这是从python 3.6+引入的一个新特性。如果使用旧版本,可能会出现编译错误。但此代码抛出错误,因为
数据集
尚未完全加载。我不完全确定您是否希望限制
字段
数据集
之外使用。Python是duck类型的,您永远不知道其他人会想出什么。