以下:
if "link?" or "Link?" in comment.body and comment.id not in comments_replied_to and comment.author != r.user.me()
變爲這樣的事情:
bool("link") OR ("Link?" in comment.body) AND (comment.id not in...), etc.
那首 「鏈接」 的值總是要True
因爲只有空字符串False
-y。
讓我們反彙編吧!
這個問題似乎經常出現,我認爲這是一個檢查Python反彙編程序的好機會!
In [1]: import dis
In [3]: def func(comment):
...: if "link?" or "Link?" in comment.body and comment.id not in comments_replied_to and comment.autho
...: r != r.user.me():
...: print ("Link String found " + comment.id)
...: print(comment.body)
...: #comment.reply("Here you go!")
...: print ("Replied to comment ")
...:
In [4]: dis.dis(func)
2 0 LOAD_CONST 1 ('link?')
3 POP_JUMP_IF_TRUE 60
6 LOAD_CONST 2 ('Link?')
9 LOAD_FAST 0 (comment)
12 LOAD_ATTR 0 (body)
15 COMPARE_OP 6 (in)
18 POP_JUMP_IF_FALSE 100
21 LOAD_FAST 0 (comment)
24 LOAD_ATTR 1 (id)
27 LOAD_GLOBAL 2 (comments_replied_to)
30 COMPARE_OP 7 (not in)
33 POP_JUMP_IF_FALSE 100
36 LOAD_FAST 0 (comment)
39 LOAD_ATTR 3 (author)
42 LOAD_GLOBAL 4 (r)
45 LOAD_ATTR 5 (user)
48 LOAD_ATTR 6 (me)
51 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
54 COMPARE_OP 3 (!=)
57 POP_JUMP_IF_FALSE 100
看看它是如何說「LOAD CONST」,然後在「POP JUMP IF TRUE」之後。這意味着沒有別的東西會被評估,因爲那個CONST
總是會是真的。
相比之下,下面下來,你將會得到:
6 LOAD_CONST 2 ('Link?')
9 LOAD_FAST 0 (comment)
12 LOAD_ATTR 0 (body)
15 COMPARE_OP 6 (in)
18 POP_JUMP_IF_FALSE 100
這是一個真正的比較是什麼樣子:它使用的二進制運算符in
比較CONST
與加載ATTR
。那些關注的問題:爲什麼這一個POP_JUMP_IF_FALSE
而不是POP_JUMP_IF_TRUE
像第一個?
你可以在家裏試試!加載dis
並開始反彙編!
不是這樣。它是comment.body中的(「link?」或comment.body中的「Link?」)和......。所以在第一次測試中也要用括號括起來。 –
你在這裏放的東西在Java中也不起作用。 Java的語法更加嚴格。 – khelwood