Pythonic方式设置变量(如果在_init中没有)__

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 . . 如果我有多个像上面这样的输入参数,我想调用另一个类来实例化它。有没有什么好

实现这一目标的最具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):
    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())