Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,根据字典是否包含键,为变量赋值的最小方式是什么?_Python_Dictionary_Lambda - Fatal编程技术网

在Python中,根据字典是否包含键,为变量赋值的最小方式是什么?

在Python中,根据字典是否包含键,为变量赋值的最小方式是什么?,python,dictionary,lambda,Python,Dictionary,Lambda,我希望通过以下方式访问字典中的一些值: self.userName = self.options["--username"] self.files = self.options["--files"].split(",") self.configurationFileName = self.options["--configuration"] if "--files" in self.options: self.files = s

我希望通过以下方式访问字典中的一些值:

self.userName              = self.options["--username"]
self.files                 = self.options["--files"].split(",")
self.configurationFileName = self.options["--configuration"]
if "--files" in self.options:
    self.files = self.options["--files"].split(",")
else:
    self.files = None
然而,有些键可能不在字典中,比如说,文件可能不在字典中。如果字典中不存在键,我希望将变量的值设置为
None
,即
self.files=None
。目前,我正在做如下工作:

self.userName              = self.options["--username"]
self.files                 = self.options["--files"].split(",")
self.configurationFileName = self.options["--configuration"]
if "--files" in self.options:
    self.files = self.options["--files"].split(",")
else:
    self.files = None

有没有更简单、更有效或更通灵的方法?为了清晰起见,我更喜欢一行一行。谢谢

通常,python方法是使用try-except块,尤其是当您希望操作大部分时间都能成功时。看

如果您希望它在大多数情况下都能成功,那么您可以先进行检查(请参阅)。一般来说,这并不是什么大问题,请在应用程序中使用任何更有意义的方法。

使用:


如果字典键不存在,获取默认值的python方法是
get
,例如

self.user_name = self.options.get("--username", None)
self.configuration_file_name = self.options.get("--configuration", None)
对于文件选项,您可以使用相同的方法,然后进行拆分:

self.files = self.options.get("--files", None)
if self.files:
    self.files = self.files.split(",")
或使用try/except块:

try:
    self.files = self.options["--files"].split(",")
except KeyError:
    self.files = None
或者,如果您确实希望它位于一行上,请使用条件表达式:

self.files = self.options["--files"].split(",") if "--files" in self.options else None
我在猜测,对于处理“--文件”的哪种方式最具python风格的看法会有所不同。我将使用上面的第一种情况(使用
get
并在之后检查dosplit),因为它与使用
get
是一致的,这无疑是处理未找到字典值的一般情况的Pythonic方法,我发现这种处理split逻辑的方法最明显、最容易理解


请注意,因为您询问的是Pythonic,所以我使用下划线_大小写而不是camelCase。这是变量命名的Python方式。

使用
get
和空字符串作为默认值,如果是空字符串或空列表,则用
None
替换:

self.files = self.options.get('--files', "").split(",") or None
这样,总是对有效对象调用
split
,如果对象为空,则得到
None

编辑

实际上,我做的测试使用了
split()
哪个
split(“,”)

所以要想工作,就应该

self.files = self.options.get('--files', "").replace(',', '\n').split() or None
使用
set
操作执行此操作的另一种方法:

self.files = set(self.options.get('--files', "").split(",")) ^ set(['']) or None
但是,
self.files
是一个集合,而不是一个列表

事后思考:

我要做的是定义一个小的助手类

class NoneFound:
  @classmethod
  def split(self, _):
    return None
然后简单地说:

self.files = self.options.get('--files', NoneFound).split(',')
请参见定义了该类的:

>>> print {'--files': "a,b,c"}.get("--files", NoneFound).split(',')
['a', 'b', 'c']
>>> print {}.get("--files", NoneFound).split(',')
None

我会退一步问“为什么我要在
self.options['--files']
中存储逗号分隔的字符串而不是一个列表?”。如果您这样做了,那么您的代码将非常简单

self.files = self.options.get("--files")

无论填充什么
self.options
都应该首先拆分列表。

此方法仍然需要进行类型检查,因为
None
没有
split
方法。因此,您需要检查的时间/内容只是四处走动。非常感谢您在这方面的帮助。方法
get
的使用特别有用。您可以在提供的中看到,可以使用
get
将类型检查干净地放在一行中。当我响应@HasanRamezani时,此方法仍然需要类型检查,因为没有一个方法没有拆分方法。所以您只是在需要检查的时间/内容上四处走动。@RogerFan-true,但这实际上只是针对文件的情况。对于一般情况(以及问题中3个示例中的2个),
get
显然是python式的方法,你不同意吗?对于文件情况,我稍微倾向于尝试除block之外的其他方法,但这可能是因为我就是这样学会的。差别不大。不过我讨厌单行if-else条款。非常感谢您在这方面的帮助。的get方法的使用特别有用,我觉得这很不和谐。少用一两行来换取更难阅读和理解。哦,这是明智的,可读性很强,而且是一行。非常感谢你的帮助!这不起作用,拆分空字符串会返回一个包含空字符串的列表,这是真的:请参阅,非常感谢您在这方面的帮助。您对什么是Pythonic的文档的引用很有帮助。谢谢您的想法。之所以存储字符串而不是列表(事实上,这会更好),是因为它是从命令行选项输入的。我正在使用将命令行选项转换为字典。我想知道在
docopt
中是否有方法处理该参数。您可以使用
[--file=]…
,但我知道
--file f1--file f2--file f3
远不如
--file f1、f2、f3
理想。例如,在
argparse
中,可以将选项定义为
p.add_参数('--files',type=lambda x:x.split(','))
,以自动将逗号分隔的字符串转换为列表。