aquil.abdullah
aquil.abdullah

Reputation: 3157

How to convert a Python object into the correct string representation

Debate abounds about using "hasattr" or "isinstance to determine the type of an object. However, I have a situation where I am trying to build a query for numexpr and I need to quote strings, but not other values. I was going to use the following code:

def get_query(key_map):
    """
    Generate an equality query, based on key/value
    pair in key_map
    """
    stmnt = ""
    for k,v in key_map.items():
        value = '"%s"' % v if isinstance(v, str) else v
        if not stmnt:
            # first equality in statement
            stmnt = "'(%s == %s)" % (k,value)
        else:
            stmnt += " & (%s == %s)" % (k,value)

    if stmnt:
        # close statement
        stmnt += "'"
    return stmnt

I considered using hasattr as well:

value = '"%v"' % v if hasattr(v,'lower') else v

I had a music teacher once tell me it's OK to break the rules as long as you know how to break them correctly. This seems like one of those cases to me. Does anyone have a suggestion for a more Pythonic way to implement this bit of code?

Sample Inputs:

key_map = {'symbol':'APPL', 'price':698.38'}

In the sample, above I want to quote APPL because it is a string, but not 698.38, because it is a float.

Regards

Upvotes: 0

Views: 109

Answers (2)

Matti Lyra
Matti Lyra

Reputation: 13088

One thing that strikes me however is your quotation marks. Suppose the string you're wrapping in quotation marks already contains quotation marks. @Eric's proposed answer takes care of that for you, it'll correctly handle escaping the quotation marks in the string should there be any.

Upvotes: 1

Eric
Eric

Reputation: 97681

I think what you might be after is:

value = repr(v)

Furthermore, your second half never uses value anyway.

Upvotes: 3

Related Questions