如何替换python3中的has_键?

如何替换python3中的has_键?,python,python-3.x,macos,Python,Python 3.x,Macos,我尝试安装,但在执行此命令时卡住了: sudo /usr/bin/python auto-selfcontrol.py 它显示了错误: AttributeError:“dict”对象没有属性“has\u key” 我正在寻找解决方案,最后替换了has_key for in操作符,但由于我只知道python的基础知识,代码对我来说相当复杂 有3个地方使用了_键,你能帮我更改一下吗,这样我就可以用python3运行了 一, 2-4 替换如下所示 一, 2-4 解决方案的正式来源如下: TL;DR是

我尝试安装,但在执行此命令时卡住了:

sudo /usr/bin/python auto-selfcontrol.py
它显示了错误:

AttributeError:“dict”对象没有属性“has\u key”

我正在寻找解决方案,最后替换了has_key for in操作符,但由于我只知道python的基础知识,代码对我来说相当复杂

有3个地方使用了_键,你能帮我更改一下吗,这样我就可以用python3运行了

一,

2-4


替换如下所示

一,

2-4


解决方案的正式来源如下:

TL;DR是这样的:

some_dict.has_key('some key')
现在是:

'some key' in some_dict
因此,在您的代码中:

return defaults.has_key("BlockStartedDate") and not NSDate.distantFuture().isEqualToDate_(defaults["BlockStartedDate"])
变成:

return "BlockStartedDate" in defaults and not NSDate.distantFuture().isEqualToDate_(defaults["BlockStartedDate"])
类似地,类似于:

if not config.has_key("selfcontrol-path"):
    # do something
变得像:

if "selfcontrol-path" not in config:
    # do something

请注意,如果不是在config:中编写“selfcontrol path”,您也可以编写
,但上面给出的示例被认为更符合Pythonic,应该是首选的。

虽然其他答案中的零碎解决方案可行,但这种方法存在缺陷,因为它太容易犯一个小错误,错过一个需要修复的地方,等等。更好的解决方法是直接使用。您可以使用以下工具一次性修复所有文件:

$2to3-f有_键-w auto-selfcontrol.py
只有从
dict.has_key(key)
转换为
dict中的key
的运行。当然,您可以自己进行修复,但在这种情况下,简单的编程修复程序可以正常工作。您可能只想在不使用
-f has_key
的情况下运行它,因此它会同时应用所有修复程序,以防在Py2和Py3之间应用任何其他破坏性更改

2to3
自动处理几乎所有的事情,除了Py2
str
类型更改(在Py3中,给定的
str
文本是
bytes
还是
str
)和整数除法,这是一个代码逻辑决定(其中,
/
可能需要更改为
/
,具体取决于计算是逻辑浮点除法还是浮点除法)。但对于
具有_键的情况,它非常可靠。

在python3.7中测试

   tmp = {'a':1, 'b':2, 'c':3}
   print(tmp.__contains__('a')) #True

使用Python2,或者尝试使用
2to3
has_key
在Python3中被弃用。为什么不使用Python2.7呢?@anh nguyen用语法替换每个检查,例如
返回默认值。has_key(“BlockStartedDate”)而不是…
替换为
返回“BlockStartedDate”在默认情况下,而不是…
可能重复@Selcuk:鉴于Python 2的寿命结束时间不到一年(寿命结束时间为2020年1月1日),现在迁移(例如使用
2to3
)可能是一个好主意。
return "BlockStartedDate" in defaults and not NSDate.distantFuture().isEqualToDate_(defaults["BlockStartedDate"])
if not config.has_key("selfcontrol-path"):
    # do something
if "selfcontrol-path" not in config:
    # do something
   tmp = {'a':1, 'b':2, 'c':3}
   print(tmp.__contains__('a')) #True