【问题标题】:Simplify/Automate the branching in this If Statement简化/自动化此 If 语句中的分支
【发布时间】:2017-12-21 14:00:28
【问题描述】:

之前已经发布过这个问题,最近收到了一些非常好的遮阳篷,尽管我还没有完全解决这个问题。我现在有一些可行的代码,虽然这个网站上的某个人可能能够修复,或者告诉我如何修复哈哈。

好吧,基本上是关于我要完成的目标的简要说明,因为我已经多次被告知我正在做的事情是无用的,或者我没有提供足够的信息,我会在这里尽力而为。我有一个程序可以在 PDF 文件上创建发票并将其打印出来。 python 脚本来自一个包含所有必要客户/服务信息等的 CSV 文件。

现在,到目前为止,我的代码中的问题是我拥有的服务数量,以及在 Python Reportlabs 中,您必须选择在页面上绘制字符串的位置。一个命令示例如下:

cursor.drawstring(xLocation,yLocation,String)

通常的做法是从第 1 串到第 6 串,一根接一根地画在它上面的那根下面。在接下来的三个示例中,您将看到第一个是在对所有服务收费的情况下函数将如何输出。第二个(中间)是不向客户收取某些服务费用的输出。最后一个(RightMost)示例是我希望它输出的代码。

Service 1         Service 1        Service 1
Service 2                          Service 3
Service 3         Service 3        Service 4
Service 4         Service 4        Service 6
Service 5                          
Service 6         Service 6

不幸的是,基于布尔逻辑,并且有 6 种可能的服务,每个可以收费或不收费,空或满,如果你愿意,那么有 64 种可能的方式来编写相同的功能以实现完美输出。

如果我们为每个服务创建一个布尔值,0 为空,1 为满, 那么我们将不得不测试从 000000 到 111111 的所有可能性。那是64。编码出来是完全合理的。

但是,我需要的服务远不止六项,而且所需的功能数量呈指数级增长。我没有编写每个函数,而是编写了一个程序,该程序将采用 0 和 1 集的文件,即:

0000000000
0000000001
0000000010
etc..

并测试每一行中的每一位。然后,此函数将根据行中的位为文件中的每一行写出一个函数。现在,它会产生不正确的输出。我先给你看我的脚本:

def testFIle():
# This Function will be used to enumerate through the same file you 
used to create the switch dictionary,
# but will define a function for each line.

# filepath = '/home/smiley/Desktop/sampletenbools'
filepath = '/home/smiley/Desktop/10boolsALL'
with open(filepath) as fp:
    num = 1
    for cnt, line in enumerate(fp):
        var = line
        b1 = str(var)[0]
        b2 = str(var)[1]
        b3 = str(var)[2]
        b4 = str(var)[3]
        b5 = str(var)[4]
        b6 = str(var)[5]
        b7 = str(var)[6]
        b8 = str(var)[7]
        b9 = str(var)[8]
        b10 = str(var)[9]

        # YdrawLocationSVC1=490
        # YdrawLocationSVC2=475
        # YdrawLocationSVC3=460
        # YdrawLocationSVC4=445
        # YdrawLocationSVC5=430
        # YdrawLocationSVC6=415
        # YdrawLocationSVC7=400
        # YdrawLocationSVC8=375
        # YdrawLocationSVC9=360
        # YdrawLocationSVC10=345

        if b1 == "0":
            YdrawLocationSVC1=1111
            YdrawLocationSVC2=1
        if b1 == "1":
            YdrawLocationSVC1 = 1

        if b2 == "0":
            YdrawLocationSVC2=1111
            YdrawLocationSVC3=2
        if b2 == "1":
            YdrawLocationSVC2 = 2

        if b3 == "0":
            YdrawLocationSVC3=1111
            YdrawLocationSVC4=3
        if b3 == "1":
            YdrawLocationSVC3 = 3

        if b4 == "0":
            YdrawLocationSVC4=1111
            YdrawLocationSVC5=4
        if b4 == "1":
            YdrawLocationSVC4 = 4

        if b5 == "0":
            YdrawLocationSVC5=1111
            YdrawLocationSVC6=5
        if b5 == "1":
            YdrawLocationSVC5 = 5

        if b6 == "0":
            YdrawLocationSVC6=1111
            YdrawLocationSVC7=6
        if b6 == "1":
            YdrawLocationSVC6 = 6

        if b7 == "0":
            YdrawLocationSVC7=1111
            YdrawLocationSVC8=7
        if b7 == "1":
            YdrawLocationSVC7 = 7

        if b8 == "0":
            YdrawLocationSVC8=1111
            YdrawLocationSVC9=8
        if b8 == "1":
            YdrawLocationSVC8 = 9

        if b9 == "0":
            YdrawLocationSVC9=1111
            YdrawLocationSVC10=9
        if b9 == "1":
            YdrawLocationSVC9 = 9

        if b10 == "0":
            YdrawLocationSVC10=1111
        if b10 == "1":
            YdrawLocationSVC10 = 10


        print "# Bitrep ="+str(var).strip("\n")
        print "def Print"+str(num)+"():"
        print"\tc.setFont('Deja', 12, leading=None)"
        print "\t# SERVICE NAME"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC1)+", stringn1)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC2)+", stringn2)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC3)+", stringn3)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC4)+", stringn4)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC5)+", stringn5)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC6)+", stringn6)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC7)+", stringn7)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC8)+", stringn8)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC9)+", stringn9)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC10)+", stringn10)"




        # print("{} : {}".format(str(line).strip("\n"), "Print" + str(num)))
        num += 1
        # print "\n"


testFIle()

目前,只要仅缺少一项服务,此代码就会在此处生成像这样的正确输出:

# Bitrep =1111111101
def Print1022():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 3, stringn3)
c.drawString(100, 4, stringn4)
c.drawString(100, 5, stringn5)
c.drawString(100, 6, stringn6)
c.drawString(100, 7, stringn7)
c.drawString(100, 9, stringn8)
c.drawString(100, 1111, stringn9)
c.drawString(100, 10, stringn10)
# Bitrep =1111111110
def Print1023():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 3, stringn3)
c.drawString(100, 4, stringn4)
c.drawString(100, 5, stringn5)
c.drawString(100, 6, stringn6)
c.drawString(100, 7, stringn7)
c.drawString(100, 9, stringn8)
c.drawString(100, 9, stringn9)
c.drawString(100, 1111, stringn10)
# Bitrep =1111111111
def Print1024():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 3, stringn3)
c.drawString(100, 4, stringn4)
c.drawString(100, 5, stringn5)
c.drawString(100, 6, stringn6)
c.drawString(100, 7, stringn7)
c.drawString(100, 9, stringn8)
c.drawString(100, 9, stringn9)
c.drawString(100, 10, stringn10)

但是,我的代码中的逻辑因多个缺失的服务而中断,如下所示:

# Bitrep =1111100101
def Print998():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 3, stringn3)
c.drawString(100, 4, stringn4)
c.drawString(100, 5, stringn5)
c.drawString(100, 1111, stringn6)
c.drawString(100, 1111, stringn7)
c.drawString(100, 9, stringn8)
c.drawString(100, 1111, stringn9)
c.drawString(100, 10, stringn10)
# Bitrep =1111100110
def Print999():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 3, stringn3)
c.drawString(100, 4, stringn4)
c.drawString(100, 5, stringn5)
c.drawString(100, 1111, stringn6)
c.drawString(100, 1111, stringn7)
c.drawString(100, 9, stringn8)
c.drawString(100, 9, stringn9)
c.drawString(100, 1111, stringn10)

如果有人可以修复此问题,以便文件中所有行的输出看起来像下一位,我会为你投票赞成 **** 大声笑:

def Print999():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 3, stringn3)
c.drawString(100, 4, stringn4)
c.drawString(100, 5, stringn5)
c.drawString(100, 1111, stringn6)
c.drawString(100, 1111, stringn7)
c.drawString(100, 6, stringn8)
c.drawString(100, 7, stringn9)
c.drawString(100, 1111, stringn10)

def Print764():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 1111, stringn3)
c.drawString(100, 3, stringn4)
c.drawString(100, 4, stringn5)
c.drawString(100, 1111, stringn6)
c.drawString(100, 1111, stringn7)
c.drawString(100, 5, stringn8)
c.drawString(100, 6, stringn9)
c.drawString(100, 1111, stringn10)

和往常一样,如果你能写到我的帖子的结尾,我会印象深刻,哈哈。感谢任何为此付出哪怕一丁点努力的人,感谢所有帮助我走到这一步的人。

【问题讨论】:

  • 刚刚想到,也许有一种方法可以为每个布尔值分配一个名称和一个值,就像字典中的值一样。说 0:s1,0:s2,1:s3,0:s4,0:s5,0:s6,1:s7,0:s8,1:s9,0:s10,其中 0 或 1 是布尔状态, ':' 是分隔符,s1-s10 是与相应位关联的服务名称。
  • 如果我们在上面做了这样的事情^,那么我们可以删除所有空服务,并且知道哪些字符串是空的,以及如何引用它们。有没有人认为他们可以做出这样的工作?

标签: python binary boolean-logic reportlab branching-strategy


【解决方案1】:

不想让你的努力泄气,但人们一直在告诉你你做错了是有原因的 :)

Reportlab 让您可以使用编程工具创建动态 PDF 文档,这意味着布局会随着内容的变化而变化。当您期待各种不同的内容时,尝试硬编码每一行的位置将很快变得笨拙/不可能并且容易中断。

让自己轻松一点,改用循环。作为一个最简单的例子,这里有一些基本页面列表的代码......

from reportlab.lib.units import cm 

# get the data selection first
my_services_list = [1,3,6]  # or my_dict, e.g. services {'1': 'message1', etc}

# set the cursor starting position
pos_X, pos_Y = 5, 15

for service in my_services_list:
    c.drawString(pos_X*cm, pos_Y*cm, service)
    # move the cursor down a line - remember that zero is the page bottom
    pos_Y -= 1

就是这样,没有空行。 .drawString 适用于更简单的页面。如果您需要更全面的方法,请阅读有关 Frames 和 Flowables 的文档。如果需要,您可以将文本排列到文本框中,就像使用桌面出版软件一样。

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多