1

pyPdfを使用してPDFを編集する小さなプログラムで問題が発生しています。PDFの最後のページ(self.lastpage)をデフォルトのパラメーターとしてクラスメソッド(pageoutput)に渡そうとしています。これを行うと、次のエラーが発生します。

Traceback (most recent call last):
  File "C:\Census\sf1.py", line 5, in <module>
    class PdfGet():
  File "C:\Census\sf1.py", line 35, in PdfGet
    def pageoutput(self,outfile,start_page=0,end_page=self.lastpage):
NameError: name 'self' is not defined 

end_pageとして数値を指定するだけでは機能しますが、属性を使用すると失敗します。このエラーは私には不可解な賭けです。pdfの最後のページを問題なく印刷できるので、pypdfでは問題ないようです。何が起こっているのかについての洞察をいただければ幸いです。

これが私のコードです(それが重要な場合は、3.x互換バージョンのpypdfを使用しています):

from pyPdf import PdfFileWriter, PdfFileReader
import re
import time

class PdfGet():
    def __init__(self):
        self.initialize()

    def initialize(self):
        while True:
            raw_args = input('Welcome to PdfGet...\n***Please Enter Arugments (infile,outfile,start_page,end_page) OR type "quit" to exit***\n').strip() 
            if raw_args.lower() == 'quit':
                break
            print("Converting Pdf...")
            self.args = re.split(r',| ',raw_args)
            self.opener(*self.args[0:1])
            if len(self.args)== 4:
                self.pageoutput(*self.args[1:])
            elif len(self.args) == 3:
                self.pageoutput(*self.args[1:3])
            else:
                self.pageoutput(*self.args[1:2])
            print("Successfuly Converted!")
            nextiter = input('Convert Another PDF? (Type "yes" or "no")').lower()
            if nextiter == 'no':
                break

    def opener(self,infile):
        self.output = PdfFileWriter()
        self.pdf = PdfFileReader(open(infile, "rb"))
        self.pagenum = self.pdf.getNumPages()
        self.lastpage = self.pagenum+1
        print(self.lastpage)

    def pageoutput(self,outfile,start_page=0,end_page=self.lastpage):
        for i in range (int(start_page)-1,int(end_page)):
            self.output.addPage(self.pdf.getPage(i))    
        outputStream = open(outfile, "wb")
        self.output.write(outputStream)
        outputStream.close()

if __name__ == "__main__":
    PdfGet()
    time.sleep(5)
4

2 に答える 2

3

むしろデフォルトの引数をに渡してからNone、メソッドで自分で割り当てを行う必要があります。

def pageoutput(self, outfile, start_page=0, end_page=None):
    if end_page is None:
        end_page = self.lastpage

この段階ではselfがまだ定義されていないため、メソッド宣言でselfを使用することはできません(モジュールがロードされるときにメソッドシグネチャが読み取られ、メソッドが呼び出されると実行時にselfが使用可能になります)。

于 2011-08-13T14:09:24.863 に答える
0

デフォルトの引数は、関数の実行時ではなく、関数の作成時に評価され、関数自体の名前空間ではなく、関数が定義されている名前空間に存在します。

これにより、次のような結果になります。1.デフォルト値で関数の他の引数を参照することはできません–この引数の値はまだ存在していません。2.可変値をデフォルト値として使用する場合は注意が必要です。関数へのすべての呼び出しは、同じ可変オブジェクトを受け取ります。

したがって、他の引数(selfなど)にアクセスする場合、またはデフォルト値を作成するときに新しい可変オブジェクトを使用する場合はNone、デフォルトとして使用し、関数の実行中に別のものを割り当てる必要があります。

于 2011-08-13T14:15:44.540 に答える