2017-02-25 2 views
-2
if "link?" or "Link?" in comment.body and comment.id not in comments_replied_to and comment.author != r.user.me(): 
     print ("Link String found " + comment.id) 
     print(comment.body) 
     #comment.reply("Here you go!") 
     print ("Replied to comment ") 
     #time.sleep(600) 

코드를 실행할 때 첫 번째 "링크"를 건너 뛰거나 "링크"여부에 관계없이 if 문 내부에서 코드를 실행합니다. comment.body에 있습니다. 코드를 다음과 같이 실행하려고합니다 :if 연산자에서 파이썬으로 논리 연산자를 사용하려면 어떻게해야합니까?

if (a or b) and c and d 

"link?" 또는 문자열 "Link?" 주석 본문에 둘 중 하나가 발견되면 for 루프에서 코드를 실행합니다. 현재 가지고있는 제품 :

if "link?" in comment.body and comment.id not in comments_replied_to and comment.author != r.user.me(): 

"or"연산자가 잘못되었습니다. 연산자를 괄호 안에 넣을 수있는 Java로 코딩하는 데 익숙합니다.

+3

다시 아니요. comment.body의'("link?"또는 comment.body의 "Link?") 및 ...'입니다. 첫 번째 테스트에서 괄호로 'in'체크도합니다. –

+1

여기에 넣은 것은 Java에서도 작동하지 않습니다. Java의 구문은 더욱 엄격합니다. – khelwood

답변

2

다음 :

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 

:로드 ATTRCONST을 비교하기 위해 이항 연산자 in을 사용하고. 주의를 기울이는 사람들을위한 질문 : 왜이 ​​하나가 POP_JUMP_IF_FALSE이 아니고 POP_JUMP_IF_TRUE이 처음과 같은가요?

집에서 사용해 볼 수 있습니다! dis을로드하고 분해를 시작하십시오!