RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 563322
Accepted
pynista
pynista
Asked:2020-09-06 16:39:09 +0000 UTC2020-09-06 16:39:09 +0000 UTC 2020-09-06 16:39:09 +0000 UTC

在 Python 中,谁负责验证参数是否传递给了正确类型的函数或方法?

  • 772

在 Python 中,谁必须检查传递给函数或方法的参数类型是否正确:

  1. 确保传递的参数类型正确是程序员的责任。该函数不会在第一步中显式检查传递的参数,而只是简单地使用它,就好像它是可靠有效的类型一样。在工作过程中,函数可以独立生成,也可以显式生成各种异常,这将指示参数不正确。这个异常将在文档字符串中描述

  2. 该函数在第一阶段显式检查传递参数的类型,并在出现错误时抛出异常,例如 TypeError。

  3. 别的东西

?

例如,如果我们传递给一个函数(例如)不是一个可迭代的,而是一个整数或实数,那么就会产生一个 TypeError 异常(因为 int 和 float 是不可迭代的)。但是你可以在一开始就明确地检查,例如,传递的参数是一个可迭代的对象并生成一些东西。

def is_positive_or_zero_values(可迭代):
    """检查iterable中的所有元素是否都是大于或等于零的数字。

    参数:
        iterable:包含要测试的值的可迭代对象。
    回报:
        bool:如果可迭代对象中的所有元素都是等于或大于零的数字,则为真。
              否则为假。
    """
    如果可迭代:
        如果是_numbers(可迭代):
            返回所有(地图(lambda x:x> = 0,可迭代))
        别的:
            返回假
    别的:
        返回假
python
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Sergey Gornostaev
    2020-09-06T16:57:39Z2020-09-06T16:57:39Z

    这个话题出现在Python in Nutshell和Fluent Python中。Pythonic 方式是根本不检查参数。引自词汇表:

    Pythonic 编程风格通过检查对象的方法或属性签名而不是通过与某些类型对象的显式关系来确定对象的类型(“如果它看起来像鸭子并且叫起来像鸭子,那它一定是鸭子。”)通过强调接口设计良好的代码不是特定类型,而是通过允许多态替换来提高其灵活性。Duck-typing 避免使用 type() 或 isinstance() 进行测试。相反,它通常采用 EAFP(请求宽恕比许可更容易)编程风格。

    • 8
  2. vadim vaduxa
    2020-09-06T19:00:06Z2020-09-06T19:00:06Z
    from functools import wraps
    import inspect
    
    def checker(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            insp = inspect.getfullargspec(fn)
            for name, _type in insp.annotations.items():
                arg = args[insp.args.index(name)]
                msg = '%s=%s' % (name, arg), '%s - %s' % (_type, _type == type(arg))
                print(msg)
                if not isinstance(arg, _type):
                    raise UserWarning(msg)
            return fn(*args, **kwargs)
        return wrapper
    
    
    @checker
    def testFn(dt: dict, num: int, st: str):
        print('OK\n')
    
    
    testFn({'key': True}, 1, 'asd')
    testFn({'key': None}, 2, 77)
    

    出去:

    ('num=1', "<class 'int'> - True")
    ('st=asd', "<class 'str'> - True")
    ("dt={'key': True}", "<class 'dict'> - True")
    OK
    
    ('num=2', "<class 'int'> - True")
    ('st=77', "<class 'str'> - False")
    Traceback (most recent call last):
      File "C:/Scripts/python/2016/3/213123.py", line 22, in <module>
        testFn({'key': None}, 2, 77)
      File "C:/Scripts/python/2016/3/213123.py", line 13, in wrapper
        raise UserWarning(msg)
    UserWarning: ('st=77', "<class 'str'> - False")
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5