我正在用Python编写一个简单的IMAP客户端。一旦我得到了一个初始脚本工作(我可以下载并向用户显示一个邮箱列表),我决定是时候让代码更有条理了。
我把IMAP相关的函数分解成一个模块名IMAP .py,把用户交互+ CUI相关的函数分解成一个模块名mail.py。我将imap.py导入到mail.py中,但是当我尝试调用imap_functions类时,我得到了一个"未定义的名称"。错误。我很困惑,因为我在imap.py的开头定义了类imap_functions,正如我所说,它被导入到主脚本中。
下面是两个脚本的代码:# mail.py
import py_cui
import imap
#from itertools import chain
host = "imap.gmail.com"
username = "user@gmail.com"
password = "someappapassword"
imap_functions = imap_functions(host, username, password)
class Mail:
def __init__(self, master):
self.master = master
# Creating widgets for mailbox list on left and message list onright
# Make Mailbox widget and get a list of folders for account
Mailboxes = self.master.add_scroll_menu('Mailboxes', 0, 0, row_span=6, column_span=1)
Mailboxes.add_item_list(imap_functions.get_folders())
# Make a Messages widget and get a list of messages based on the folder selected.
Messages = self.master.add_scroll_menu('Messages', 0, 1, row_span=6, column_span=4)
# First select the folder
# message_list = client....whatever method lists messages
# Messages.add_item_list(message_list)
# Create the CUI with 7 rows 6 columns (may change later), pass it to the wrapper object, and start it
root = py_cui.PyCUI(7, 6)
root.set_title('Mail')
s = Mail(root)
imap_functions.login()
root.start()
和
### imap.py
import ssl
import imapclient
import email
class imap_functions:
def __init__(self, host, username, password):
self.host = host
self.username = username
self.password = password
self.client = IMAPClient(host)
def login(self, username, password):
"Handling various auth protocols"
#client.starttls() --- gmail does not support starttls
client.login(username, password)
return;
def get_folders(self):
"Grabbing the list of folders for the account"
get_folders = client.list_folders()
folder_list = []
for folders in get_folders:
folder_list.append(folders[2])
return folder_list;
#client.select_folder("INBOX")
您可以将导入更改为
from imap import imap_functions
# ...
imap_functions = imap_functions(host, username, password)
或者正如@mkrieger1所指出的,您可以通过调用
从模块访问类import imap
# ...
imap_functions = imap.imap_functions(host, username, password)
我还建议将类名更改为ImapFunctions
,因为snake_case通常用于变量和函数。理想情况下,您可以将名称更改为更好的名称,如ImapClient
,但我想这是一个选择的问题,谁会看到你的代码除了你。