我試圖寫一個非常基本的slackbot,從查找機器人的 user_id開始,這比我期待的要困難得多。我可以從documentation得出的唯一方法是拉出每個用戶的列表,然後爲我的機器人用戶搜索該列表。這似乎有點奇怪,所以如果任何人都可以提出一個更好的方法,我是全部耳朵。爲什麼我的代碼打印「if」結果和「else」結果?
但現在正在發生的事情是,它找到的USER_ID,然後繼續嗆:
Ready to look for REDACTED
<type 'dict'>
2016-06-27 20:22:05.380408 DEBUG REDACTED : ABC123
2016-06-27 20:22:05.381173 DEBUG No user found named REDACTED
2016-06-27 20:22:05.385158 DEBUG ABC123
這是我的代碼:
from slackclient import SlackClient
import re
class Bot(object):
def __init__(self, token, username):
self.client = SlackClient(token)
self.username = username
self.user_id = {}
def run(self):
if self.client.rtm_connect():
self.user_id = self.whoami(self.client.server.username)
else:
print("Connection failed.")
def whoami(self, username):
"""
finds the ID for this username.
"""
all_users = self.client.api_call("users.list")
print "Ready to look for " + username
for user in all_users['members']:
if re.match(username, user['name']):
print(user['name'] + " : " + user['id'])
user_id = user['id']
if (user_id not in locals()):
print("No user found named " + username)
else:
print(user_id)
return user_id
然後我把它叫做:
api_token = 'redacted'
username = 'redacted'
first_bot = Bot(api_token, username)
first_bot.run()
我想弄清楚爲什麼它找到用戶,然後立即說「找不到用戶」 - 然後打印user_id
- 我希望它打印一個或另一個。
哎呀,什麼可怕的代碼!不要使用'locals()'!首先要檢查你想要什麼,你應該在'loca()'中引用'user_id'而不是'user_id',否則yuo會得到'UnboundLocalError'。相反,你應該從循環中斷開並使用'for'循環的'else'子句。 – Bakuriu
至少在python 3中,如果你在'locals()'中檢查一個變量,如果不作爲字符串傳遞,你會得到'False'。 'n在當地人()'→'假'; ''n'in locals()'→'True' – Luis
@Bakuriu我想你的意思是說「locals()」不是一個很好的方法來確定變量是否已被設置,因爲{reason} 。但是你遺漏了{reason}部分:)至少有一個問題明確推薦在'quotes''中使用'locals()'tho ...和變量名。 – Amanda