如何将“被”关键字用Python实现?如何将“被”关键字用Python实现?(How is the

2019-05-10 12:21发布

...的is可用于字符串平等关键字。

>>> s = 'str'
>>> s is 'str'
True
>>> s is 'st'
False

我想这两个__is__()__eq__()但他们没有工作。

>>> class MyString:
...   def __init__(self):
...     self.s = 'string'
...   def __is__(self, s):
...     return self.s == s
...
>>>
>>>
>>> m = MyString()
>>> m is 'ss'
False
>>> m is 'string' # <--- Expected to work
False
>>>
>>> class MyString:
...   def __init__(self):
...     self.s = 'string'
...   def __eq__(self, s):
...     return self.s == s
...
>>>
>>> m = MyString()
>>> m is 'ss'
False
>>> m is 'string' # <--- Expected to work, but again failed
False
>>>

Answer 1:

与测试字符串is只有当字符串实习工作。 除非你真的知道你在做什么,明确实习 ,你应该使用的字符串is在字符串。

is 身份 ,而不是平等的测试。 这意味着Python的只是一个比较对象驻留在内存地址。 is基本上回答了这个问题:“我必须为同一对象两个人的名字?” - 超载那将毫无意义。

例如, ("a" * 100) is ("a" * 100)False。 通常Python的每个字符串写入到不同的存储位置,实习大多发生于字符串文字。



Answer 2:

is操作者等同于比较id(x)值。 id是当前实现使用指针作为比较。 所以,你不能超载is本身,AFAIK你不能超载id无论是。

所以,你不能。 不寻常的蟒蛇,但它就在那里。



Answer 3:

Python的is关键字测试对象标识。 你不应该使用它来测试字符串是否相等。 这似乎经常工作,因为Python实现,像一颗颗非常高的水平语言,执行字符串的“实习”。 也就是说,字符串和值在内部保持在散列列表,以及那些是相同的呈现为同一个对象的引用。 (这是可能的,因为python的string是不可改变的)。

但是,与任何实现细节,你不应该依赖于这一点。 如果你想测试平等使用==操作符。 如果你真的想测试对象的身份,然后使用is ---和我会捉襟见肘拿出你应该关心的字符串对象身份的情况下。 不幸的是,你不能指望两个字符串是否在某种程度上,因为前述实习的“故意”相同的对象引用。



Answer 4:

is关键字进行比较的对象(或者说,如果比较两个引用是同一个对象)。

这是,我想,为什么没有任何机制来提供自己的实现。

它发生在对字符串工作有时因为Python店字符串“巧妙”,这样,当你创建两个相同的字符串它们存储在一个对象。

>>> a = "string"
>>> b = "string"
>>> a is b
True
>>> c = "str"+"ing"
>>> a is c
True

你可以看到希望的参考VS在一个简单的“复制”示例数据对比:

>>> a = {"a":1}
>>> b = a
>>> c = a.copy()
>>> a is b
True
>>> a is c
False


Answer 5:

如果你不害怕与字节码搞乱了的,你可以拦截和补丁COMPARE_OP8 ("is")参数进行比较的对象你的钩子函数来调用。 看看dis的启动模块文件。

而且不要忘了拦截__builtin__.id()太多,如果有人会做id(a) == id(b)而不是a is b



Answer 6:

是没有一个字符串变量比较字符串值,当该字符串开头两个字符串变量“ - ”。 我的Python版本是2.6.6

>>> s = '-hi'
>>> s is '-hi'
False 
>>> s = '-hi'
>>> k = '-hi'
>>> s is k 
False
>>> '-hi' is '-hi'
True


Answer 7:

“是”,而比较==值进行比较的对象的身份。

例:

a=[1,2]
b=[1,2]
#a==b returns True
#a is b returns False

p=q=[1,2]
#p==q returns True
#p is q returns True


Answer 8:

你不能重载is运营商。 你想重载什么是==操作符。 这可以通过定义来完成__eq__在类方法。



Answer 9:

您正在使用的身份比较。 ==可能是你想要的东西。 唯一的例外情况是当你想进行检查,如果一个项目,另一个是完全相同的对象,并在相同的存储位置。 在你的例子,该项目的是不一样的,因为一个比另一个(串)不同类型(my_string)的。 此外,还有为SomeClass的没有这样的事情。 __is__在蟒蛇(当然,除非你把它放在那里自己)。 如果有,用的是比较对象将不可靠简单地比较存储位置。

当我第一次遇到的关键字,它混淆我的。 我本来以为和==都没有变化。 他们制作了许多对象从解释输出相同。 这种类型的假设实际上是究竟什么?是。 这是蟒蛇相当于“嘿,不要误以为这两个对象。他们是不同的。”,这基本上是什么[不管是谁,是理顺我出去]说。 措辞太多不同,但有一点==另一点。

在一些有用的例子和一些文字,以帮助有时混淆差异参观从python.org的邮件主机的文件通过“丹尼柳”写成

或者,如果是离线的,使用非上市引擎收录我把它的身体。

在他们的情况下,在约20个左右的蓝月(蓝月是一个真实的事件),都下来了,我会引用代码示例

###
>>> my_name = "danny"
>>> your_name = "ian"
>>> my_name == your_name
0                #or False
###

###
>>> my_name[1:3] == your_name[1:3]
1    #or True
###

###
>>> my_name[1:3] is your_name[1:3]
0
###


Answer 10:

断言错误容易出现与关键词当比较对象。 例如,对象AB可能拥有相同的价值,共享相同的内存地址。 因此,做一个

>>> a == b

会,以评估

True

但是,如果

>>> a is b

计算结果为

False

你应该检查

>>> type(a)

>>> type(b)

这些可能是不同的,对于失败的原因。



文章来源: How is the 'is' keyword implemented in Python?