# General Python question (sorry): pass string as function and argument?

• Sorry to clot the DrawBot board with what is certainly a general Python question (and probably a simple one at that), but stackoverflow isn't helping, probably because I'm not phrasing the question right. Here goes:

I have code that uses functions to define shapes in a matrix and return their outlines as a BezierPath(). The functions have descriptive names that call the function with no arguments—for example,

c1()


The code also has a function, compareShape(), that tests all unique pairs of these outlines to see if they touch or intersect; if they do not, it creates a new frame and draws the shapes from those outlines in that frame. That function is called with the functions that draw the outlines to be tested as arguments; for example:

compareShape(c1(), c1t())


My problem: I can use combinations() from itertools to generate a list of these unique pairs, but I have to pass the text from those pairs as function calls/arguments. What am I trying to do here? Like I said, I'd look it up but I'm not sure I'm framing the question right. Code follows:

from itertools import combinations

canvasX = 1000
canvasY = 1250
u = (canvasX/50)

def c1():
c = BezierPath()
c.oval(-8 * u - (9 * u), -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u - (9 * u), -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c1t():
c = BezierPath()
c.oval(-8 * u - (9 * u), -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u - (9 * u), -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u - (9 * u), -8 * u, 16 * u, 8 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c1ti():
c = BezierPath()
c.oval(-8 * u - (9 * u), -8 * u + (7 * u), 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u - (9 * u), -7 * u + (7 * u), 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u - (9 * u), 7 * u, 16 * u, 8 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c1b():
c = BezierPath()
c.oval(-8 * u - (9 * u), -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u - (9 * u), -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u - (9 * u), 0, 16 * u, 8 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c1bi():
c = BezierPath()
c.oval(-8 * u - (9 * u), -8 * u - (7 * u), 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u - (9 * u), -7 * u - (7 * u), 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u - (9 * u), -8 * u - (7 * u), 16 * u, 8 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c1r():
c = BezierPath()
c.oval(-8 * u - (9 * u), -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u - (9 * u), -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u - (9 * u), -8 * u, 8 * u, 16 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c1l():
c = BezierPath()
c.oval(-8 * u - (9 * u), -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u - (9 * u), -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-(9 * u), -8 * u, 8 * u, 16 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c2():
c = BezierPath()
c.oval(-8 * u, -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c2t():
c = BezierPath()
c.oval(-8 * u, -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u, -8 * u, 16 * u, 7.5 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c2ti():
c = BezierPath()
c.oval(-8 * u, -8 * u + (7 * u), 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u + (7 * u), 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u, 7 * u, 16 * u, 8 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c2b():
c = BezierPath()
c.oval(-8 * u, -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u, .5 * u, 16 * u, 7.5 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c2bi():
c = BezierPath()
c.oval(-8 * u, -8 * u - (7 * u), 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u - (7 * u), 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u, -8 * u - (7 * u), 16 * u, 8 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c2r():
c = BezierPath()
c.oval(-8 * u, -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u, -8 * u, 8 * u, 16 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c2l():
c = BezierPath()
c.oval(-8 * u, -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(0, -8 * u, 8 * u, 16 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c3():
c = BezierPath()
c.oval(-8 * u + (9 * u), -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u + (9 * u), -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c3t():
c = BezierPath()
c.oval(-8 * u + (9 * u), -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u + (9 * u), -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u + (9 * u), -8 * u, 16 * u, 8 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c3ti():
c = BezierPath()
c.oval(-8 * u + (9 * u), -8 * u + (7 * u), 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u + (9 * u), -7 * u + (7 * u), 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u + (9 * u), 7 * u, 16 * u, 8 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c3b():
c = BezierPath()
c.oval(-8 * u + (9 * u), -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u + (9 * u), -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u + (9 * u), 0, 16 * u, 8 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c3bi():
c = BezierPath()
c.oval(-8 * u + (9 * u), -8 * u - (7 * u), 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u + (9 * u), -7 * u - (7 * u), 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u + (9 * u), -8 * u - (7 * u), 16 * u, 8 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c3r():
c = BezierPath()
c.oval(-8 * u + (9 * u), -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u + (9 * u), -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u + (9 * u), -8 * u, 8 * u, 16 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c3l():
c = BezierPath()
c.oval(-8 * u + (9 * u), -8 * u, 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u + (9 * u), -7 * u, 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(9 * u, -8 * u, 8 * u, 16 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c4():
c = BezierPath()
c.oval(-8 * u, -8 * u - (17 * u), 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u - (17 * u), 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c4t():
c = BezierPath()
c.oval(-8 * u, -8 * u - (17 * u), 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u - (17 * u), 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u, -8 * u - (17 * u), 16 * u, 8 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c4b():
c = BezierPath()
c.oval(-8 * u, -8 * u - (17 * u), 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u - (17 * u), 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u, -(17 * u), 16 * u, 8 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c4r():
c = BezierPath()
c.oval(-8 * u, -8 * u - (17 * u), 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u - (17 * u), 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(-8 * u, -8 * u - (17 * u), 8 * u, 16 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c

def c4l():
c = BezierPath()
c.oval(-8 * u, -8 * u - (17 * u), 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u - (17 * u), 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
r = BezierPath()
r.rect(0, -8 * u - (17 * u), 8 * u, 16 * u)
c = c.difference(r)
c.closePath()
if toggle == 1:
drawPath(c)
return c
"""
def c5(): #may not be needed
c = BezierPath()
c.oval(-8 * u, -8 * u + (17 * u), 16 * u, 16 * u)
ch = BezierPath()
ch.oval(-7 * u, -7 * u + (17 * u), 14 * u, 14 * u)
ch.closePath()
c = c.difference(ch)
c.closePath()
if toggle == 1:
drawPath(c)
return c
"""
def b1m():
b = BezierPath()
b.rect(-12 * u, -7 * u, u, 14 * u)
b.closePath()
if toggle == 1:
drawPath(b)
return b

def b1t():
b = BezierPath()
b.rect(-12 * u, -7 * u, u, 22 * u)
b.closePath()
if toggle == 1:
drawPath(b)
return b

def b1b():
b = BezierPath()
b.rect(-12 * u, -15 * u, u, 22 * u)
b.closePath()
if toggle == 1:
drawPath(b)
return b

def b2m():
b = BezierPath()
b.rect(-u/2, -7 * u, u, 14 * u)
b.closePath()
if toggle == 1:
drawPath(b)
return b

def b2t():
b = BezierPath()
b.rect(-u/2, -7 * u, u, 22 * u)
b.closePath()
if toggle == 1:
drawPath(b)
return b

def b2b():
b = BezierPath()
b.rect(-u/2, -15 * u, u, 22 * u)
b.closePath()
if toggle == 1:
drawPath(b)
return b

def b3m():
b = BezierPath()
b.rect(11 * u, -7 * u, u, 14 * u)
b.closePath()
if toggle == 1:
drawPath(b)
return b

def b3t():
b = BezierPath()
b.rect(11 * u, -7 * u, u, 22 * u)
b.closePath()
if toggle == 1:
drawPath(b)
return b

def b3b():
b = BezierPath()
b.rect(11 * u, -15 * u, u, 22 * u)
b.closePath()
drawPath(b)
return b

def b4r():
b = BezierPath()
b.rect(0, -u/2, 8 * u, u)
b.closePath()
if toggle == 1:
drawPath(b)
return b

def b4l():
b = BezierPath()
b.rect(-8 * u, -u/2, 8 * u, u)
b.closePath()
if toggle == 1:
drawPath(b)
return b

def b5():
b = BezierPath()
b.rect(-8 * u, 9 * u, 16 * u, u)
b.closePath()
if toggle == 1:
drawPath(b)
return b

def b6():
b = BezierPath()
b.rect(-8 * u, -10 * u, 16 * u, u)
b.closePath()
if toggle == 1:
drawPath(b)
return b

def a1():
a = BezierPath()
a.moveTo((-9 * u, 7 * u))
a.lineTo((-9 * u + (12.7017059 * u), -15 * u))
a.lineTo((
-9 * u + (12.7017059 * u) - (u * cos(radians(30))),
-15 * u - (u * sin(radians(30)))
))
a.lineTo((
-9 * u - (u * cos(radians(30))),
7 * u - (u * sin(radians(30)))
))
a.closePath()
if toggle == 1:
drawPath(a)
return a

def a1s():
a = BezierPath()
a.moveTo((-9 * u, 7 * u))
a.lineTo((-9 * u + (8.0829037 * u), -7 * u))
a.lineTo((
-9 * u + (8.0829037 * u) - (u * cos(radians(30))),
-7 * u - (u * sin(radians(30)))
))
a.lineTo((
-9 * u - (u * cos(radians(30))),
7 * u - (u * sin(radians(30)))
))
a.closePath()
if toggle == 1:
drawPath(a)
return a

def a1si():
a = BezierPath()
a.moveTo((-9 * u, -7 * u))
a.lineTo((-9 * u + (8.0829037 * u), 7 * u))
a.lineTo((
-9 * u + (8.0829037 * u) - (u * cos(radians(30))),
7 * u + (u * sin(radians(30)))
))
a.lineTo((
-9 * u - (u * cos(radians(30))),
-7 * u + (u * sin(radians(30)))
))
a.closePath()
if toggle == 1:
drawPath(a)
return a

def a2():
a = BezierPath()
a.moveTo((9 * u, 7 * u))
a.lineTo((9 * u - (12.7017059 * u), -15 * u))
a.lineTo((
9 * u - (12.7017059 * u) + (u * cos(radians(30))),
-15 * u - (u * sin(radians(30)))
))
a.lineTo((
9 * u + (u * cos(radians(30))),
7 * u - (u * sin(radians(30)))
))
a.closePath()
if toggle == 1:
drawPath(a)
return a

def a2s():
a = BezierPath()
a.moveTo((9 * u, 7 * u))
a.lineTo((9 * u - (8.0829037 * u), -7 * u))
a.lineTo((
9 * u - (8.0829037 * u) + (u * cos(radians(30))),
-7 * u - (u * sin(radians(30)))
))
a.lineTo((
9 * u + (u * cos(radians(30))),
7 * u - (u * sin(radians(30)))
))
a.closePath()
if toggle == 1:
drawPath(a)
return a

def a2si():
a = BezierPath()
a.moveTo((9 * u, -7 * u))
a.lineTo((9 * u - (8.0829037 * u), 7 * u))
a.lineTo((
9 * u - (8.0829037 * u) + (u * cos(radians(30))),
7 * u + (u * sin(radians(30)))
))
a.lineTo((
9 * u + (u * cos(radians(30))),
-7 * u + (u * sin(radians(30)))
))
a.closePath()
if toggle == 1:
drawPath(a)
return a

matrix = ['c1', 'c1t', 'c1ti', 'c1b', 'c1bi', 'c1r', 'c1l', 'c2', 'c2t', 'c2ti', 'c2b', 'c2bi', 'c2r', 'c2l', 'c3', 'c3t', 'c3ti', 'c3b', 'c3bi', 'c3r', 'c3l', 'c4', 'c4t', 'c4b', 'c4r', 'c4l', 'b1m', 'b1t', 'b1b', 'b2m', 'b2t', 'b2b', 'b3m', 'b3t', 'b3b', 'b4r', 'b4l', 'b5', 'b6', 'a1', 'a1s', 'a1si', 'a2', 'a2s', 'a2si']
pairs = []

def compareShape(s1, s2):
if len(set(s1.points) & set(s2.points)) == 0 and len(s1.intersectionPoints(s2)) == 0:
newPage(canvasX, canvasY)
fill(1)
rect(0, 0, canvasX, canvasY)
translate(canvasX/2, canvasY/2)
fill(0)
drawPath(s1)
drawPath(s2)

for subset in combinations(matrix, 2):
pairs.append(subset)

for n in range(len(pairs)):
compareShape(pairs[n][0](), pairs[n][1]())

#saveImage('~/Desktop/gürtler_script_matrix.jpg')


• The error being thrown is:

Traceback (most recent call last): File "gürtler_script1_matrix.py", line 619, in <module> TypeError: 'str' object is not callable

• @mauricemeilleur Figured it out: the problem is that the matrix and pairs lists are populated with strings. I moved all the function definitions to the top and populated the matrix with their names—problem solved. Now I have a bunch of new problems to solve, but they're what I expected. Coding is the gift that keeps on giving.

• side note use triple ` to highlight code