Joe F.
Joe F.

Reputation: 867

Auto format arguments to string

I am writing a function that takes some arguments and builds a SQL query string. I currently have each of the keyword arguments assigned to the string by name, and I am thinking that there has to be an easier way to automatically format the keyword arguments expected in the string. I'm wondering if it is possible to automatically format (or assign) a keyword argument to the query string if the argument name matches.

Here is my current function:

def create_query(
    who_id,
    what_id=None,
    owner_id=None,
    subject,
    description,
    due_date,
    is_closed=False,
    is_priority=False,
    is_reminder=True,
    ):

    query_str = """
        'WhoId':'{who_id}',
        'Subject':'{subject}',
        'Description':'{description}',
        'ActivityDate':'{due_date}',
        'IsClosed':'{is_closed}',
        'IsPriority':'{is_priority}',
        'IsReminderSet':'{is_reminder}',
        """.format(
            who_id=who_id,
            subject=subject,               # Mapping each of these to the
            description=description,       # identically named variable
            due_date=due_date,             # seems dumb
            is_closed=is_closed,
            is_priority=is_priority,
            is_reminder=is_reminder,
            )

And I would like something that is more like this:

def create_query(**kwargs):
    query_string = """
         'WhoId':'{who_id}',
         'Subject':'{subject}',
         'Description':'{description}',
         ...
         """.format(
             for key in **kwargs:
                 if key == << one of the {keyword} variables in query_string >>:
                     key = << the matching variable in query_string >>

Upvotes: 1

Views: 93

Answers (1)

Stefan Pochmann
Stefan Pochmann

Reputation: 28656

def create_query(**kwargs):
    query_string = """
         'WhoId':'{who_id}',
         'Subject':'{subject}',
         'Description':'{description}',
         ...
         """.format(**kwargs)
    print(query_string)

Can be used like this then:

create_query(who_id=123, subject="Boss", description="he's bossy",
             will_be_ignored="really?")

Prints:

         'WhoId':'123',
         'Subject':'Boss',
         'Description':'he is bossy',
         ...

Note the additional parameter will_be_ignored that I entered. It will simply be ignored. You don't have to filter that yourself.

But better don't build the query string yourself. Let the database connector handle that. For example, if my example said "he's bossy" then that would break the query because it uses ' as delimiter. Your database connector should allow you to give it queries with placeholders and values, and then properly replace the placeholders with the values.

Alternative:

def create_query(**kwargs):
    parameters = (('WhoId', 'who_id'),
                  ('Subject','subject'),
                  ('Description', 'description'))
    query_string = ','.join(r"'{}':'{{{}}}'".format(name, kwargs[id])
                            for name, id in parameters
                            if id in kwargs)
    print(query_string)

create_query(who_id=123, description="he's bossy",
             will_be_ignored="really?")

Prints:

'WhoId':'{123}','Description':'{he's bossy}'

Upvotes: 2

Related Questions