我有以下课程来生成随机的简单PDF。
from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.pagesizes import letter
import random
import string
import os
BOOTH_NAME = [
'Distrito', 'Sector', 'Residencia', 'Fraccionamiento',
'Privado', 'Ciudad', 'Colonia', 'Departamentos',
'Recinto', 'Barrio', 'Comuna', 'Vecindad'
]
BOOTH_CODE = list(string.ascii_uppercase)
ZONE_CODE = ['NORTE', 'OESTE', 'SUR', 'ESTE', 'SUROESTE', 'NOROESTE', 'SURESTE', 'NORESTE']
CONCEPT_NAME = ['COMPRA/VENTA', 'TESTIMONIO', 'ESCRITURAS']
WIDTH, HEIGHT = letter
DIR_NAME = '/Users/gmwill934/PycharmProjects/notarIA/pdfs/'
class PDF(object):
def __init__(
self,
casilla=str(BOOTH_NAME[random.randint(0, len(BOOTH_NAME) - 1)]),
clave_casilla=str(BOOTH_CODE[random.randint(0, len(BOOTH_CODE) - 1)]),
zona=str(ZONE_CODE[random.randint(0, len(ZONE_CODE) - 1)]),
concepto=str(CONCEPT_NAME[random.randint(0, len(CONCEPT_NAME) - 1)])
):
self.casilla = casilla
self.clave_casilla = clave_casilla
self.zona = zona
self.concepto = concepto
self.name = '{} {} {}'.format(self.casilla, self.clave_casilla, self.zona)
self.save_name = os.path.join(PDF.DIR_NAME, self.name+'.pdf')
def create_pdf(self):
pdf = Canvas(self.save_name, pagesize=letter)
pdf.setTitle(self.name)
pdf.grid([10, PDF.WIDTH - 10], [10, PDF.HEIGHT - 10])
pdf.drawString(20, PDF.HEIGHT - 30, 'Numero de Casilla:')
pdf.drawString(130, PDF.HEIGHT - 30, str(random.randint(1000, 9999)))
pdf.drawString(20, PDF.HEIGHT - 50, 'Nombre de Casilla:')
pdf.drawString(130, PDF.HEIGHT - 50, self.name)
pdf.drawString(20, PDF.HEIGHT - 70, 'Numero de Votos:')
pdf.drawString(130, PDF.HEIGHT - 70, str(random.randint(100000, 999999)))
pdf.drawString(20, PDF.HEIGHT - 90, 'Concepto:')
pdf.drawString(130, PDF.HEIGHT - 90, str(self.concepto))
pdf.showPage()
pdf.save()
基本上,create_pdf方法创建具有随机值的PDF。
我接下来要做的是创建PDF class
的多个实例,一次创建多个PDF。
from src.pdf import PDF
# instantiate PDF class
# create multiple instances
pdf = PDF()
for n in range(10):
pdf.create_pdf()
我也尝试过这个。
from src.pdf import PDF
# instantiate PDF class
# create multiple instances
for n in range(10):
pdf = PDF()
pdf.create_pdf()
问题是它只创建1个PDF文件,而我期望是10个。似乎在创建1个PDF之后就完成了。
有人可以对此提出建议吗?我想念什么吗?
函数(方法)定义]时评估的参数的默认值>。因此,您的随机生成逻辑仅运行一次。您应该这样做:
def __init__( self, casilla=None, ... ): self.casilla = ( casilla if casilla is not None else str(BOOTH_NAME[random.randint(0, len(BOOTH_NAME) - 1)])) ...
参考:https://docs.python.org/3/reference/compound_stmts.html#function-definitions
[默认参数值在执行函数定义时从左到右求值。
这意味着在定义函数时对表达式求值一次,并且将相同的“预先计算”值用于每个电话。这对于理解默认参数何时是可变对象(例如列表或字典)尤其重要:如果函数修改了该对象(例如,通过将项目附加到列表),则默认值实际上已被修改。这通常不是预期的。解决此问题的一种方法是使用None作为默认值,并在函数主体中明确测试它,例如:]def whats_on_the_telly(penguin=None): if penguin is None: penguin = [] penguin.append("property of the zoo") return penguin