views:

1470

answers:

5

I have a function where I need to do something to a string. I need the function to return a boolean indicating whether or not the operation succeeded, and I also need to return the modified string.

In C#, I would use an out parameter for the string, but there is no equivalent in Python. I'm still very new to Python and the only thing I can think of is to return a tuple with the boolean and modified string.

Related question: Is it pythonic for a function to return multiple values?

+5  A: 

Returning a tuple is the usual way to do this in Python.

Chris Upchurch
+5  A: 

Return a tuple.

def f(x):
    # do stuff
    return (True, modified_string)

success, modified_string = f(something)
sysrqb
+39  A: 
def f(in_str):
    out_str = in_string.upper()
    return True, out_str # Creates tuple automatically

succeeded, b = f("a") # Automatic tuple unpacking
John Millikin
+22  A: 

Why not throw an exception if the operation wasn't successful? Personally, I tend to be of the opinion that if you need to return more than one value from a function, you should reconsider if you're doing things the right way or use an object.

But more directly to the point, if you throw an exception, you're forcing them to deal with the problem. If you try to return a value that indicates failure, it's very well possible somebody could not check the value and end up with some potentially hard to debug errors.

Jason Baker
Agreed. Pythonic functions shouldn't return codes to indicate "success/failure" when one is vastly more likely than the other. Just throw an exception in the exceptional case.That being said, just return a tuple when needed: "return a, b, c"
Dan
I don't like functions that throw exceptions for non-fatal errors.
Seun Osewa
+3  A: 

Throwing an exception for failure is one good way to proceed, and if you're returning a lot of different values, you can return a tuple. For the specific case you're citing, I often take an intermediate approach: return the modified string on success, and return None on failure. I'm enough of an unreconstructed C programmer to want to return a NULL pointer to char on failure.

If I were writing a routine to be used as part of a larger library and consumed by other developers, I'd throw an exception on failure. When I'm eating my own dogfood, I'll probably return different types and test on return.

tuxedo