RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1184755
Accepted
biomotor
biomotor
Asked:2020-10-01 18:21:05 +0000 UTC2020-10-01 18:21:05 +0000 UTC 2020-10-01 18:21:05 +0000 UTC

在类的开头检查 arg[4] 变量

  • 772

不能在类的开头检查变量的存在,告诉我如何实现它?
类代码开始:

class MButton():
    def __init__(self, *arg):
        self.parent = arg[0]
        self.limage = arg[1]
        self.lcommand = arg[2]
        self.rcommand = arg[3]

尝试过这样的事情:,
(还有更多选择......)

try:
    arg[4]
except IndexError:
    arg[4] = None

问题2:

如果这些选项怎么办?允许吗?什么更好?

选项1:

Вызов:
self.test = MTest(width=10, height=10, **{'bdsize':1, 'bgcolor':2, 'parent':3})

class MTest():
    def __init__(self, width, height, **args):
        self.width=width
        self.height=height
        self.bdsize=args['bdsize']
        self.bgcolor=args['bgcolor']
        self.bdcolor=args['bdcolor']
        self.parent=args['parent']

选项 2:

Вызов:
self.test = MTest(**{'width':10, 'height':10, 'bdsize':1, 'bgcolor':2, 'parent':3})

class MTest():
    def __init__(self, **args):
        self.width=args['width']
        self.height=args['height']

        self.bdsize=args.get('bdcolor')
        self.bgcolor=args.get('bdcolor')
        self.bdcolor=args.get('bdcolor')
        self.parent=args.get('bdcolor')

选项 3:

Вызов:
self.test = MTest(**{'width':10, 'height':10, 'bdsize':1, 'bgcolor':2, 'parent':3})

class MTest():
    def __init__(self, **args):
        self.width=args.get('width')
        self.height=args.get('height')
        self.bdsize=args.get('bdcolor')
        self.bgcolor=args.get('bdcolor')
        self.bdcolor=args.get('bdcolor')
        self.parent=args.get('bdcolor')
        
        if not self.width == None or self.height == None:
            raise Exception('ERROR: Проверьте правильность введенных данных обязательных параметров width и height !')

选项 4:

Вызов:
self.test = MTest(width=10, height=10, bdsize=1, parent=3)

class MTest():
    def __init__(self, **args):
        self.width=args['width']
        self.height=args['height']
        self.bdsize=args.get('bdsize')
        self.parent=args.get('parent')
        self.bgcolor=args.get('bgcolor')
        self.bdcolor=args.get('bdcolor')

选项 5:

Вызов:
self.test = MTest(width=10, height=10, bdsize=1, parent=3)

class MTest():
    def __init__(self, width, height, bdsize=None, bgcolor=None, bdcolor=None, parent=None):
        self.width=width
        self.height=height
        self.bdsize=bdsize
        self.bgcolor=bgcolor
        self.bdcolor=bdcolor
        self.parent=parent
python
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    insolor
    2020-10-01T22:25:33Z2020-10-01T22:25:33Z

    如果您的选项有限,最好不要将它们隐藏在*args或后面**kwargs。

    第一种情况的工作变体:

    class MButton():
        def __init__(self, parent, limage, lcommand, rcommand=None):
            self.parent = parent
            self.limage = limage
            self.lcommand = lcommand
            self.rcommand = rcommand
    

    最后一个参数是可选的。

    对于“选项 1”:

    class MTest():
        def __init__(self, width, height, bdsize=None, bgcolor=None, parent=None):
            self.width=width
            self.height=height
            self.bdsize=bdsize
            self.bgcolor=bgcolor
            self.parent=parent
    
    
    test = MTest(width=10, height=10, bdsize=1, bgcolor=2, parent=3)
    

    您还可以在方法头中指定参数类型,例如:

    class MTest():
        def __init__(self, width: int, height: int, bdsize: int=None, parent=None):
            self.width=width
            self.height=height
            self.bdsize=bdsize
            self.parent=parent
    

    如果您尝试将不同类型的值传递给参数,PyCharm 将突出显示此代码,否则在通过 mypy 检查时会显示错误。当您在解释器中运行代码时,事实可能不是错误,因为。Python 是一种动态类型的语言(例如,如果您希望一个值是整数,并且您尝试将其作为数字处理,但在此之前,例如,传递了一个字符串,则会发生错误)。

    您可以在此处阅读有关类型注释的信息:Python 类型注释简介

    在任何情况下,方法参数的显式枚举都可以被认为是一种文档。IDE 和代码编辑器可以在编写代码时处理此问题并显示提示(参见下面的屏幕截图),这一事实使编程变得更加容易(甚至 IDLE 也以交互方式显示带有参数的提示)。指定一个参数*args,否则**kwargs您将失去这些机会。

    VS代码: 截图 VSCode

    PyCharm: PyCharm 截图

    • 1
  2. strawdog
    2020-10-01T18:55:56Z2020-10-01T18:55:56Z

    阅读 **kwargs 和 get dictionary 方法:

    class MyClass():
        def __init__(self, **kwargs):
            self.one = kwargs.get("one")
            self.two = kwargs.get("two")
            self.three = kwargs.get("three")
            self.four = kwargs.get("four")
                
        def show(self):
            print(id(self))
            print(self.one)
            print(self.two)
            print(self.three)
            print(self.four)
            
    d1 = {"one":1, "two":3, "three":3, "four":4}
    d2 = {"one":1, "three":3, "four":4}
    
    c1 = MyClass(**d1)
    c2 = MyClass(**d2)
    
    c1.show()
    # 153208200
    # 1
    # 3
    # 3
    # 4
    
    c2.show()
    # 153208456
    # 1
    # None
    # 3
    # 4
    

    如果需要在没有参数的情况下显示错误,那么可以添加,例如:

    if not self.one: # или if sel.one == None
        raise Exception('My error!')
    
    • 0

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

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

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +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
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +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