Calling getpass() says too many positional arguments when trying to print prompt

Question:

I am very new to Python (Only a couple weeks) and I’m trying to make a rock paper scissors game for Replits 100 days of code. My previous game was very simple and worked fine but it wont fly as a template for this lesson so I’ve started from scratch but I’m having trouble.

from getpass import getpass as hinput
ch1 = hinput("Enter",p1,"choice: ")

I keep getting this error after the players enter the names

Traceback (most recent call last):
  File "main.py", line 2, in <module>
    ch1 = hinput("Enter",p1,"choice: ")
TypeError: unix_getpass() takes from 0 to 2 positional arguments but 3 were given
Asked By: shawn szczepkowski

||

Answers:

You should use

hinput(f"Enter {p1} choice: ")

This makes use of f-strings, which, for Python 3.5+, allow you to format variables within a string. For instance:

a = 4
b = 3
print(f"a + b = {a+b}")
>>> a + b = 7

Note that "Enter",p1,"choice: " is a tuple with 3 elements, and not a single string.

Answered By: Geoffrey Negiar

You’re using getpass like print. print is sort of special in Python, as it’s written to take any number of arguments. You can write functions like that yourself, but it’s not the default. And getpass is written to only accept a single string as an argument (and an output stream, but we don’t need that for our purposes).

You’ll need to build the string yourself. That can be done with concatenation

hinput("Enter " + p1 + " choice: ")

or format strings

hinput("Enter %s choice: " % p1)       # Old (printf) style
hinput("Enter {} choice: ".format(p1)) # New style

or, on Python 3.5 and newer, f-strings

hinput(f"Enter {p1} choice: ")
Answered By: Silvio Mayolo
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.