我在使用pyPdf编辑Pdfs的小程序时遇到了一些问题。我试图将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 compatbile版本的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)
答案 0 :(得分:2)
您应该将默认参数传递给None
,然后在方法中自行完成作业。
def pageoutput(self, outfile, start_page=0, end_page=None):
if end_page is None:
end_page = self.lastpage
在方法声明中不可能使用self,因为在此阶段尚未定义self(在加载模块时读取方法签名,在调用方法时self在运行时可用。)
答案 1 :(得分:0)
默认参数在创建函数时计算,而不是在函数执行时计算,并且它们位于定义函数的命名空间中,而不是函数本身的命名空间中。
这会产生以下后果: 1.您不能在默认值中引用该函数的其他参数 - 该参数的值尚不存在。 2.使用可变值作为默认值时应该小心 - 对函数的所有调用都会收到相同的可变对象。
因此,如果要在构造默认值时访问其他参数(例如self)或使用新的可变对象,则应使用None
作为默认值,并在执行期间分配不同的内容功能。