【问题标题】:How do I tell if an optional parameter exists or not in python如何判断python中是否存在可选参数
【发布时间】:2016-08-19 11:49:29
【问题描述】:
class Dimensional:
    def __init__(self, gravity, l=0, m=0, t=0):
        assert type(l) == int
        assert type(m) == int
        assert type(t) == int

        self.gravity = gravity
        self.l = l
        self.m = m
        self.t = t

我正在尝试定义一个 __bool__ 方法,它为任何非零值返回 True 我做了什么:

def __bool__(self): 
    g = self.gravity
    _l = self.l
    _m = self.m
    _t = self.t
    if not self.gravity:
        g += 1
    if not self.l:
        _l += 1
    if not self.m:
        _m += 1
    if not self.t:
        _t += 1

    if g != 0 and _l != 0 and _m != 0 and _t != 0:
        return True
    else:
        return False

【问题讨论】:

  • assert 不是控制应用程序流程的好方法。您可能还会发现any 很有用
  • 我不明白你在 __bool__ 里做什么。你是说return any(self.gravity, self.l, self.m, self.t)吗?
  • 这与可选参数有什么关系,或者确定它们是否由用户指定?
  • 为了避免所有那些assert 命令...如果lmt 必须是整数值,如果任何参数不等于它自己的整数值(if int(m) != m: raise ValueError('Meaningful error message.')),然后将每个整数值分配给对象的字段(self.m = int(m))。

标签: python class boolean


【解决方案1】:

只需在所有属性上返回 or 表达式的布尔转换:

def __bool__(self): 
    return bool(self.gravity or self.l or self.m or self.t)

如果这些值中的任何一个不为 0,bool() 将生成 True,否则将生成 False

无论如何,您的代码都会始终返回 True;对于 0增加你的变量的任何字段;所以你的 4 个局部变量最终都会保证非零。

使用上述方法演示:

>>> bool(Dimensional(0,1,1,1))
True
>>> bool(Dimensional(0,0,0,0))
False

请注意,如果您使用的是 Python 2,则需要将方法命名为 __nonzero__()__bool__ 是 Python 3 的名称。

【讨论】:

  • 谢谢!但它仍然没有通过:bool(Dim(0,1,1,1))
  • @Frog_Luan: bool(Dimensional(0,1,1,1)) 产生True,因为存在三个非零值。只有bool(Dimensional(0,0,0,0)) 会产生False
  • @Frog_Luan:你正在使用 Python 3,对吧?在 Python 2 上没有 __bool__ 方法;将其命名为__nonzero__
猜你喜欢
  • 2013-05-12
  • 1970-01-01
  • 2018-01-16
  • 2021-07-26
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多