I'm trying to make figlet text in my terminal in python, as per one of the practice problems in week 6 of CS50. I'm trying to have a font picked randomly from pyfiglet's list of fonts, and I'm trying to implement this as follows:
import random
from pyfiglet import Figlet
figlet = Figlet()
figfonts = figlet.getFonts()
# ...
random.seed()
figlet.setFont(random.choice(figfonts)) # error here
However, when I run this in my terminal, I get the following error:
TypeError: Figlet.setFont() takes 1 positional argument but 2 were given
I'm confused. I'm only providing figlet.setFont()
1 argument, why is it saying that there are two? I just can't piece together what the error message is trying to tell me is wrong.
The method setFont
has the signature:
def setFont(self, **kwargs)
So passing font
as a keyword argument (vs. a positional argument like you tried to) should fix the issue (as suggested by @jasonharper in the comments).
For example:
figlet.setFont(font=random.choice(figfonts))
I'm confused. I'm only providing
figlet.setFont()
1 argument, why is it saying that there are two?
As you can see from the signature above, the first positional argument is self
. Python automatically passes the instance (in this case figlet
) as the first argument because setFont
is "bound" to the instance figlet
when called as figlet.setFont()
. It's also possible (but unconventional) to call instance methods like so: Figlet.setFont(figlet)