Bad operand type for unary +: 'str'
Categories:
Understanding and Resolving Python's 'Bad operand type for unary +: 'str'' Error

This article explains the 'Bad operand type for unary +: 'str'' error in Python, detailing its causes, common scenarios, and providing practical solutions to convert strings to numeric types for unary operations.
The Python error message TypeError: bad operand type for unary +: 'str'
is a common pitfall for beginners and sometimes even experienced developers. It occurs when you attempt to use the unary plus operator (+
) on a string data type. While the unary plus operator might seem redundant in Python (as it doesn't change the sign of a number), it's primarily used to indicate a positive value or to explicitly convert certain types to their numeric equivalent, similar to how int()
or float()
might work in some contexts. However, it strictly requires a numeric operand.
What is the Unary Plus Operator?
In mathematics, the unary plus operator (+
) simply denotes a positive number. For example, +5
is just 5
. In Python, its primary use case is less about changing a value's sign (as numbers are positive by default) and more about type conversion in specific scenarios, or simply for symmetry with the unary minus operator (-
).
When applied to a numeric type (like int
or float
), it returns the number itself. However, when Python encounters a string where it expects a number for this operation, it raises the TypeError
.
# Correct usage with numbers
print(+5) # Output: 5
print(+3.14) # Output: 3.14
# Incorrect usage with a string
# print(+'hello') # This would raise the TypeError
Demonstration of unary plus operator with numbers vs. strings
Common Causes of the Error
This error typically arises when you expect a variable to hold a numeric value, but it actually contains a string. This often happens due to:
- User Input: Data obtained from user input (e.g., using
input()
function) is always a string, even if the user types numbers. - File Reading: Data read from text files (CSV, TXT, etc.) is initially treated as strings.
- Web Scraping/API Responses: Data parsed from web pages or API calls often comes as strings.
- Implicit Type Conversion Assumptions: Assuming Python will automatically convert a string of digits to a number when performing arithmetic operations.
flowchart TD A[Start] B["User Input (e.g., input())"] C["File Read (e.g., .read())"] D["API/Web Data (e.g., JSON parse)"] E{Data Type?} F["String '123'"] G["Numeric 123"] H["Attempt Unary + Operator"] I["TypeError: bad operand type for unary +: 'str'"] J["Successful Operation"] A --> B A --> C A --> D B --> E C --> E D --> E E --> F E --> G F --> H G --> H H --> I H --> J
Flowchart illustrating common sources leading to the 'bad operand type' error.
How to Resolve the Error
The solution is straightforward: explicitly convert the string to a numeric type (integer or float) before applying any arithmetic operations, including the unary plus.
Python provides built-in functions for this purpose:
int()
: Converts a string to an integer.float()
: Converts a string to a floating-point number.
# Scenario 1: User Input
user_input_str = input("Enter a number: ") # user types '10'
# print(+user_input_str) # This would cause the error
# Corrected:
user_input_int = int(user_input_str)
print(+user_input_int) # Output: 10
# Scenario 2: String from a file or API
price_str = "25.99"
# print(+price_str) # This would cause the error
# Corrected:
price_float = float(price_str)
print(+price_float) # Output: 25.99
# Example with unary minus for comparison
temperature_str = "-5"
temperature_int = int(temperature_str)
print(-temperature_int) # Output: 5 (unary minus flips the sign)
Examples of explicit type conversion to resolve the error.
try-except
blocks when converting user input or external data to numbers. This allows you to gracefully handle cases where the string might not be a valid number (e.g., user types 'abc' instead of '123').user_input = input("Enter a number: ")
try:
number = int(user_input)
result = +number
print(f"Successfully converted and operated: {result}")
except ValueError:
print(f"Error: '{user_input}' is not a valid integer.")
except TypeError as e:
print(f"An unexpected type error occurred: {e}")
Robust type conversion with error handling.
When is Unary Plus Actually Useful?
While often overlooked, the unary plus can be useful in specific contexts, particularly when you want to ensure a value is treated as a number or when working with custom classes that define __pos__
method for specific behavior. For standard numeric types, it's mostly for consistency with unary minus or for explicit (though often redundant) type coercion in some scenarios.
+
) is defined by the __pos__
magic method in Python classes. If you create a custom class and want to support this operator, you would implement this method.