다음 :
if "link?" or "Link?" in comment.body and comment.id not in comments_replied_to and comment.author != r.user.me()
는 다음과 같이되다 :
만 빈 문자열이
False
-y 때문에 최초의 "링크"값은 항상
True
될 것입니다 그건
bool("link") OR ("Link?" in comment.body) AND (comment.id not in...), etc.
.
해체하겠습니다!
이 질문은 자주 올 것 같아서 파이썬의 디스어셈블러를 체크 아웃 할 수있는 좋은 기회라고 생각합니다!
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
이 항상 true가 될 것이므로 그 행에서 평가되는 것은 없습니다.
비교하여, 아래로 아래에, 당신이 얻을 :
같은 실제 비교 모습입니다
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
:로드 ATTR
와 CONST
을 비교하기 위해 이항 연산자 in
을 사용하고. 주의를 기울이는 사람들을위한 질문 : 왜이 하나가 POP_JUMP_IF_FALSE
이 아니고 POP_JUMP_IF_TRUE
이 처음과 같은가요?
집에서 사용해 볼 수 있습니다! dis
을로드하고 분해를 시작하십시오!
다시 아니요. comment.body의'("link?"또는 comment.body의 "Link?") 및 ...'입니다. 첫 번째 테스트에서 괄호로 'in'체크도합니다. –
여기에 넣은 것은 Java에서도 작동하지 않습니다. Java의 구문은 더욱 엄격합니다. – khelwood