[英]instantiating optional arguments in python class?
因此,如果在一個類中有幾個可選參數,那么如何在基本實例化完成后遍歷可選參數以設置其值? 也正在尋找更多建議使用Python方式來整體處理此代碼。 謝謝!
必需的參數:
p = argparse.ArgumentParser()
p.add_argument('-s',
'--server',
type=str,
help='smtp server',
required='True')
p.add_argument('-p',
'--port',
type=int,
help='smtp server port',
...等
可選參數:
p.add_argument('-P',
'--replyto',
type=str,
help='reply to header. rtfrfc')
p.add_argument('-R',
'--returnpath',
type=str,
help='reply to header. rtfrfc')
args = p.parse_args()
mysmtp的初始化:
class mysmtp:
def __init__(self, server, port, rcptto, mailfrom, subject,
displayname='', displayemail='', xsender='',
replyto='', returnpath=''):
self.server = server
self.port = port
self.rcptto = rcptto
self.mailfrom = mailfrom
self.subject = subject
self.displayname = ''
self.displayemail = ''
self.replyto = ''
self.xsender = ''
self.filename = ''
self.returnpath = ''
實例化mysmtp的主要功能
def main():
q = mysmtp(args.server,
args.port,
args.rcptto,
args.mailfrom,
args.subject)
可選參數
optargs = [args.displayname,
args.displayemail,
args.xsender,
args.replyto,
args.returnpath]
嘗試簡化所有這些參數(如果存在)的設置,而沒有一百萬個if:
for arg in optargs:
print arg
if arg:
q.arg
print q
q.send_message()
main()
我將如何在for循環中擴展arg
的值並將其放在q.{}
?
當q.send_message
運行時,似乎所有可選變量都沒有在main()
被循環設置,因此它們的值為空,因為它們是在__init__
中默認設置的:
def send_message(self):
msg = MIMEMultipart('alternative')
msg['From'] = self.mailfrom
msg['To'] = self.rcptto
msg['Subject'] = self.subject
if self.displayname:
d = "{} \"<{}>\"\r\n".format(self.displayname, self.displayemail)
else:
d = ''
if self.xsender:
x = "X-Sender: {} \"<{}>\"\r\n".format(self.displayname, self.displayemail)
else:
x = ''
if self.replyto:
rto = "Reply-To: {} \"{}\"\r\n".format(self.displayname, self.replyto)
else:
rto = ''
if self.returnpath:
rpat = "Return-Path: {} \"{}\"\r\n".format(self.displayname, self.returnpath)
else:
rpat = ''
完整的源代碼如下。
import smtplib
import socket
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import argparse
p = argparse.ArgumentParser()
p.add_argument('-s',
'--server',
type=str,
help='smtp server',
required='True')
p.add_argument('-p',
'--port',
type=int,
help='smtp server port',
required='True')
p.add_argument('-r',
'--rcptto',
type=str,
help='to address',
required='True')
p.add_argument('-m',
'--mailfrom',
type=str,
help='MAIL FROM email headers. ' +
'please note this email may need to be set ' +
'as a valid domain you are sending from to ' +
'bypass spf checks',
required='True')
p.add_argument('-d',
'--displayname',
type=str,
help='display name to fool mail clients. ' +
'useful if you cant spoof your MAILFROM',
required='True')
p.add_argument('-l',
'--displayemail',
type=str,
help='display from email to fool mail clients. ' +
'useful if you cant spoof your MAILFROM'
)
p.add_argument('-x',
'--xsender',
type=str,
help='rtfm or rtfrfc' +
'useful if you cant spoof your MAILFROM',
)
p.add_argument('-j',
'--subject',
type=str,
help='email subject',
required='True')
p.add_argument('-f',
'--filename',
type=str,
help='file attachment')
p.add_argument('-P',
'--replyto',
type=str,
help='reply to header. rtfrfc')
p.add_argument('-R',
'--returnpath',
type=str,
help='reply to header. rtfrfc')
args = p.parse_args()
class mysmtp:
def __init__(self, server, port, rcptto, mailfrom, subject,
displayname='', displayemail='', xsender='',
replyto='', returnpath=''):
self.server = server
self.port = port
self.rcptto = rcptto
self.mailfrom = mailfrom
self.subject = subject
self.displayname = ''
self.displayemail = ''
self.replyto = ''
self.xsender = ''
self.filename = ''
self.returnpath = ''
def send_message(self):
msg = MIMEMultipart('alternative')
msg['From'] = self.mailfrom
msg['To'] = self.rcptto
msg['Subject'] = self.subject
if self.displayname:
d = "{} \"<{}>\"\r\n".format(self.displayname, self.displayemail)
else:
d = ''
if self.xsender:
x = "X-Sender: {} \"<{}>\"\r\n".format(self.displayname, self.displayemail)
else:
x = ''
if self.replyto:
rto = "Reply-To: {} \"{}\"\r\n".format(self.displayname, self.replyto)
else:
rto = ''
if self.returnpath:
rpat = "Return-Path: {} \"{}\"\r\n".format(self.displayname, self.returnpath)
else:
rpat = ''
print rto
body = "{}{}{}{}sent w/ smtplib and email.mime py libs".format(d,x,rto,rpat)
print body
content = MIMEText(body, 'plain')
msg.attach(content)
if self.filename:
f = file(self.filename)
attachment = MIMEText(f.read())
attachment.add_header('Content-Disposition',
'attachment',
filename=self.filename)
msg.attach(attachment)
print f
try:
print '[+] attempting to send message'
s = smtplib.SMTP(self.server, self.port)
s.sendmail(self.mailfrom, self.rcptto, msg.as_string())
print '[$] successfully sent through {}:{}'.format(self.server,
self.port)
except socket.error as e:
print '[!] could not connect'
# def __init__(self, server, port, rcptto, mailfrom, subject,
# displayname='', displayemail='', xsender='',
# replyto='', returnpath=''):
def main():
q = mysmtp(args.server,
args.port,
args.rcptto,
args.mailfrom,
args.subject)
optargs = [args.displayname,
args.displayemail,
args.xsender,
args.replyto,
args.returnpath]
for arg in optargs:
print arg
if arg:
q.arg = arg
print q
q.send_message()
main()
這就是您想要的。 當您不確定問題中有多少個參數可以傳遞給函數時,可以使用*args
。 它允許您將任意數量的參數傳遞給函數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.