pythoncs50figlet

figlet.setFont() and random.choice() conflicting with each other


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.


Solution

  • 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)