【问题标题】:How to define parameter datatype in order to restrict other data inputs in Python如何定义参数数据类型以限制 Python 中的其他数据输入
【发布时间】:2021-08-26 21:53:47
【问题描述】:

我想知道,有没有办法为函数的参数定义数据类型,在我的例子中是 def init 构造函数,这样当我创建一个对象时,我只能传递与设置的数据类型相关。

例如:

class Checking(BankAccount):
    def __init__(self, acc_number, acc_holder, acc_balance):
        self.acc_num = acc_number
        self.acc_holder = acc_holder
        self.acc_balance = acc_balance

random = Checking("A84829", "Roger ", "a637.23")

因此,当我随机创建对象并传递参数时,我希望程序无法运行,因为我输入了不正确的数据类型。现在,该程序可以运行,但我不知道为什么,因为我对 python 很陌生。

我也试过这样做:

class Checking(BankAccount):
    def __init__(self, acc_number: int, acc_holder: str, acc_balance: float):

【问题讨论】:

  • Python 是一种动态类型语言,需要自己编写代码。或者使用库,例如​​pydantic
  • @juanpa.arrivillaga 抱歉,当您说自己为此编写代码时,我对您的意思有点困惑?
  • 正如 juanpa.arrivillaga 所提到的,Python 像鸭子一样嘎嘎叫,“如果它看起来像鸭子,又像鸭子叫,那就是鸭子”关于类型(阅读:动态类型.. .) 您可以在此处查看 realpython-doc 以获取更多信息:realpython.com/python-type-checking 检查变量是否为特定类型的内置函数是 isinstancedocs.python.org/3/library/functions.html#isinstance
  • @Aman 我的意思是你必须自己编写检查类型的代码。同样,有一些库可以处理这个问题,例如pydantic
  • @juanpa.arrivillaga 谢谢先生!

标签: python class constructor


【解决方案1】:

在 python 中,类型提示(这是您在第二个示例中所做的)不强制执行,并且仅在您的 IDE 支持的情况下用于提供正确的代码完成。其次,正如上面注释中所说,python 是动态类型的,这意味着变量可以在程序中的任何位置具有任何类型。

一种解决方案是明确检查您的输入类型:

class Checking(BankAccount):
    def __init__(self, acc_number, acc_holder, acc_balance):
        if not isinstance(acc_number, int): 
            throw Error('account number must be an integer')
        if not isinstance(acc_holder, str): 
            throw Error('account holder must be an string')
        if not isinstance(acc_balance, float): 
            throw Error('account balance must be an float')
        self.acc_num = acc_number
        self.acc_holder = acc_holder
        self.acc_balance = acc_balance

这将导致 Python 在参数类型错误时抛出错误。

【讨论】:

  • 我想我明白这一点。您能否解释一下在这种情况下“isinstance”是什么。我认为您所说的是实例,特别是实例加上帐号,例如一个 int,如果不是,则抛出错误。
  • 是的,isinstance 接受 2 个参数,如果第一个参数与第二个参数类型相同,则返回 true,否则返回 false。 isinstance 是 python 中的内置函数。换句话说,这些语句中的每一个都在说“如果参数不是我想要的类型,则抛出错误,否则让程序继续”
  • 谢谢!我只是被奇怪的措辞“如果不是 isinstance”弄糊涂了
  • @Aman ifinstance(i,int) 可以说成如果iint 的一个实例
  • 知道了!谢谢你,先生! @BoarGules
【解决方案2】:

正如@juanpa.arrivillaga 所提到的,一个很好的方法是使用像pydantic 这样的库。

这是一个例子:

from pydantic import BaseModel


class Checking(BaseModel):
    acc_num: int
    acc_holder: str
    acc_balance: float


Checking.acc_number = 1234
Checking.acc_holder = "Roger"


【讨论】:

    猜你喜欢
    • 2014-09-20
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多