Pythonic方式设置变量(如果在_init中没有)__
实现这一目标的最具python风格或优雅的方式是什么Pythonic方式设置变量(如果在_init中没有)__,python,Python,实现这一目标的最具python风格或优雅的方式是什么 def __init__(self, connection=None, some=None, thing=None, else=None): if connection is None: self.connection = SetConnection() else: self.connection = connection . . 如果我有多个像上面这样的输入参数,我想调用另一个类来实例化它。有没有什么好
def __init__(self, connection=None, some=None, thing=None, else=None):
if connection is None:
self.connection = SetConnection()
else:
self.connection = connection
.
.
如果我有多个像上面这样的输入参数,我想调用另一个类来实例化它。有没有什么好方法可以让它看起来干净而不冗长?您可以使用二进制运算符:
def __init__(self, connection=None, some=None, thing=None, else=None):
self.connection = connection or SetConnection()
如果连接为None(False),它将运行SetConnection()
使用三元运算符
def __init__(self, connection=None, some=None, thing=None, else=None):
self.connection = SetConnection() if connection is None else connection
如果出于任何进一步的原因,您不需要记录
connection
最初作为None
传递的事实,那么您可以覆盖该名称:
if connection is None: connection = SetConnection()
self.connection = connection
我的2c使用:
旧答案:
self.connection = connection if connection else SetConnection()
注:我不知道
连接的类
或类型
,如果您也不知道,请使用类型(连接)
只是为了好玩,为什么不呢
def __init__(self, **kwargs):
self.connection = kwargs.get('connection', SetConnection())
这就把与虚幻价值观有关的问题放在一边,同时又是一个pythonic。尽管如此,它肯定还有其他缺点,例如与代码的自动文档化相关的缺点。这只在False
、0
、空列表等值不可用时才有效。解决此问题的一个线性函数是self.connection=connection,如果连接不是None-else SetConnection()
请注意,这假设参数的所有有效值都是真实的。如果是,则会根据输入进行假设。尽管他要求“有什么好方法可以让它看起来干净而不冗长”,但这种方法有其局限性(事实上,如果连接
可以有一个不真实的有效非无
值,或者如果设置连接
类以一种不寻常的方式定义了\ubool\uu
,那么这种方法就行不通了),根据我的经验,它也是非常地道的。我肯定见过很多代码在这种情况下使用或而不是三元表达式。考虑到他的问题的局限性,这是有道理的。谢谢你站在我这边,或
有它的缺点,但它确实有助于“整洁”的代码,这就是他所要求的,我一直觉得很神奇,它总是“简单”引起如此多流量和想法的问题您可以使用isinstance
检查连接是否确实是您需要的类/类型,而不是其他类型。@DeepSpace确实如此:虽然这是一种有效的语法,但请不要这样格式化您的代码。把内线放在它自己的缩进线上。同样的争论也适用于贾巴的回答:考虑到上下文,这可能是可以的,但它提出了一个未声明的假设,即0、False
、[]
、(
)、{}
和'
不属于连接的有效可能性。一种解决方案是使用isinstance
来确保连接是我们期望的实例。虽然其他答案显示“更简单”的解决方案,但我最终使用了它,因为当输入为0、False、[]、()、{}和“”时,它不会误导
def __init__(self, **kwargs):
self.connection = kwargs.get('connection', SetConnection())