NameError: имя 'self' не определяется при передаче атрибута в качестве параметра методу - PullRequest
0 голосов
/ 13 августа 2011

У меня возникли проблемы с созданной мною маленькой программой, которая редактирует Pdfs с помощью pyPdf.Я пытаюсь передать последнюю страницу 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, это работает, но это не удастся, если я использую атрибут.Эта ошибка является загадкой для меня.Кажется, это не проблема с pypdf, поскольку я могу напечатать последнюю страницу pdf без проблем.Я был бы очень признателен за понимание того, что происходит!

Вот мой код (я использую 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)

Ответы [ 2 ]

2 голосов
/ 13 августа 2011

Вы должны скорее передать ему аргумент по умолчанию None, а затем в методе выполнить присвоение самостоятельно.

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

Невозможно использовать self в объявлении метода, потому что на этом этапе selfеще не определено (сигнатуры методов читаются при загрузке модуля, а self доступна во время выполнения при вызове метода.)

0 голосов
/ 13 августа 2011

Аргументы по умолчанию оцениваются при создании функции, а не при ее выполнении, и они находятся в пространстве имен, в котором определяется функция, а не в пространстве имен самой функции.

Это имеет следующие последствия: 1. Вы не можете ссылаться на другие аргументы функции в значении по умолчанию - значение этого аргумента еще не существует. 2. Будьте осторожны при использовании изменяемых значений в качестве значений по умолчанию - все вызовы функции будут получать один и тот же изменяемый объект.

Итак, если вы хотите получить доступ к другим аргументам (таким как self) или использовать свежий изменяемый объект при создании значения по умолчанию, вы должны использовать None в качестве значения по умолчанию и назначить что-то другое во время выполнения функция.

...