2011-08-13 106 views
0

我遇到一些问题,我用一个小程序编辑了使用pyPdf编辑PDF。我试图到PDF(self.lastpage)作为默认参数的最后一页传递到一个类的方法(pageoutput)当我这样做,我收到以下错误:NameError:传递属性作为参数时未定义名称'self'方法

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的最后一页没有问题。对于发生了什么,我将不胜感激!

这里是我的代码(我用pypdf的3.X版本compatbile如果该事项):

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

你应该默认参数,而把它传递给None,然后在方法做作业你自己。

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

这是不可能的使用方法声明自我,因为在这个阶段的自我还没有定义(当模块被加载读取方法签名,自可在运行时调用该方法。 )

+0

谢谢修复它!我应该更详细地搜索,因为显然我的错误很常见,我认为我以前使用self.sth作为默认参数,所以我从来没有想过这是问题所在。 – THX1138

+0

如果你认为是这样的话,请考虑标记为答案:) –

0

默认参数是在创建函数时(而不是函数执行时)评估的,它们位于函数定义的名称空间中,而不是函数本身的名称空间中。

这会产生以下后果: 1.您不能在默认值中引用该函数的其他参数 - 此参数的值尚不存在。 2.使用可变值作为默认值时,您应该小心 - 对该函数的所有调用都会收到相同的可变对象。

因此,如果您想要访问其他参数(如self)或在构造默认值时使用新的可变对象,则应该使用None作为默认值,并在函数执行过程中分配不同的东西。