114

This is ugly. What's a more Pythonic way to do it?

import datetime t= (2010, 10, 2, 11, 4, 0, 2, 41, 0) dt = datetime.datetime(t[0], t[1], t[2], t[3], t[4], t[5], t[6]) 
1

2 Answers 2

158

Generally, you can use the func(*tuple) syntax. You can even pass a part of the tuple, which seems like what you're trying to do here:

t = (2010, 10, 2, 11, 4, 0, 2, 41, 0) dt = datetime.datetime(*t[0:7]) 

This is called unpacking a tuple, and can be used for other iterables (such as lists) too. Here's another example (from the Python tutorial):

>>> range(3, 6) # normal call with separate arguments [3, 4, 5] >>> args = [3, 6] >>> range(*args) # call with arguments unpacked from a list [3, 4, 5] 
Sign up to request clarification or add additional context in comments.

5 Comments

It works for arbitrary iterables.
I'd like to add that this syntax works anywhere (not just in function calls) in python 3.5, so for instance statements like x, y, z = *(1, 2, 3) will work without error (as it should have been a long time ago)
it there a way to do this among other list items? like my_tuple = ("B", "C"); "%s %s %s" % ("A", *my_tuple)?
Nevermind - I think this is a limitation of the %s string substitution method. Using "{} {} {}".format("A", *my_tuple) instead does the trick.
Does anyone know any details about how Python implements unpacking internally?
16

Refer https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists

 dt = datetime.datetime(*t[:7]) 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.