簡體   English   中英

實例化python類中的可選參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM