Но как я могу ничего сохранить до 01:30:00 -04: 00?
blockquote>Вы можете конвертировать в UTC, например:
SELECT CONVERT_TZ('2009-11-29 01:30:00','-04:00','+00:00');
Еще лучше, сохраните даты как поле TIMESTAMP . Это всегда хранится в UTC, и UTC не знает о летнем / зимнем времени.
Вы можете конвертировать из UTC в localtime, используя CONVERT_TZ :
SELECT CONVERT_TZ(UTC_TIMESTAMP(),'+00:00','SYSTEM');
Где «+00: 00» - это UTC, часовой пояс и «SYSTEM» - локальный часовой пояс OS, в котором работает MySQL.
Синтаксис - это *
и **
. Имена *args
и **kwargs
являются условными, но нет жесткого требования использовать их.
Вы будете использовать *args
, когда вы не уверены, сколько аргументов может быть передано вашей функции, т.е. это позволяет вам передать произвольное количество аргументов вашей функции. Например:
>>> def print_everything(*args):
for count, thing in enumerate(args):
... print( '{0}. {1}'.format(count, thing))
...
>>> print_everything('apple', 'banana', 'cabbage')
0. apple
1. banana
2. cabbage
Аналогично, **kwargs
позволяет обрабатывать именованные аргументы, которые вы не определили заранее:
>>> def table_things(**kwargs):
... for name, value in kwargs.items():
... print( '{0} = {1}'.format(name, value))
...
>>> table_things(apple = 'fruit', cabbage = 'vegetable')
cabbage = vegetable
apple = fruit
Вы можете использовать их вместе с именованными аргументами. Явные аргументы получают значения первыми, а затем все остальное передается в *args
и **kwargs
. Именованные аргументы идут первыми в списке. Например:
def table_things(titlestring, **kwargs)
Вы также можете использовать оба аргумента в одном определении функции, но *args
должен встречаться перед **kwargs
.
Вы также можете использовать синтаксис *
и **
при вызове функции. Например:
>>> def print_three_things(a, b, c):
... print( 'a = {0}, b = {1}, c = {2}'.format(a,b,c))
...
>>> mylist = ['aardvark', 'baboon', 'cat']
>>> print_three_things(*mylist)
a = aardvark, b = baboon, c = cat
Как вы можете видеть, в данном случае она берет список (или кортеж) элементов и распаковывает его. Тем самым он сопоставляет их с аргументами в функции. Конечно, вы можете иметь *
как в определении функции, так и в вызове функции.
Вот одно из моих любимых мест использования синтаксиса **
, как в последнем примере Дейва Вебба:
mynum = 1000
mystr = 'Hello World!'
print "{mystr} New-style formatting is {mynum}x more fun!".format(**locals())
Я не уверен, что это очень быстро по сравнению с просто использованием самих имен, но набирать текст намного легче!
Одно из мест, где использование *args
и **kwargs
весьма полезно - это подклассификация.
class Foo(object):
def __init__(self, value1, value2):
# do something with the values
print value1, value2
class MyFoo(Foo):
def __init__(self, *args, **kwargs):
# do something else, don't care about the args
print 'myfoo'
super(MyFoo, self).__init__(*args, **kwargs)
Таким образом, вы можете расширить поведение класса Foo, не зная слишком многого о Foo. Это может быть очень удобно, если вы программируете для API, который может измениться. MyFoo просто передает все аргументы классу Foo.
Один случай, когда * args и ** kwargs полезны, - это при написании функций-оболочек (таких как декораторы), которые должны быть может принимать произвольные аргументы для передачи оборачиваемой функции. Например, простой декоратор, который печатает аргументы и возвращаемое значение оборачиваемой функции:
def mydecorator( f ):
@functools.wraps( f )
def wrapper( *args, **kwargs ):
print "Calling f", args, kwargs
v = f( *args, **kwargs )
print "f returned", v
return v
return wrapper
*args и **kwargs - это специальные магические возможности Python. Подумайте о функции, которая может иметь неизвестное количество аргументов. Например, по каким-то причинам вы хотите иметь функцию, которая суммирует неизвестное количество чисел (и вы не хотите использовать встроенную функцию sum). Поэтому вы пишете эту функцию:
def sumFunction(*args):
result = 0
for x in args:
result += x
return result
и используете ее так: sumFunction(3,4,6,3,6,8,9).
**kwargs имеет другую функцию. С помощью **kwargs вы можете передать произвольные ключевые слова-аргументы функции и получить к ним доступ как к диктофону.
def someFunction(**kwargs):
if 'text' in kwargs:
print kwargs['text']
Вызов someFunction(text="foo") выведет foo.
Представьте, что у вас есть функция, но вы не хотите ограничивать количество принимаемых ею параметров. Пример:
>>> import operator
>>> def multiply(*args):
... return reduce(operator.mul, args)
Затем вы используете эту функцию, например:
>>> multiply(1,2,3)
6
or
>>> numbers = [1,2,3]
>>> multiply(*numbers)
6
Названия *args
и **kwargs
или **kw
являются чисто условными. Это облегчает нам чтение кода друг друга
Одно из удобных мест - использование модуля struct
struct.unpack()
возвращает кортеж, тогда как struct.pack()
использует переменное число аргументов. При манипулировании данными удобно иметь возможность передать кортеж в struck.pack()
, например,
tuple_of_data = struct.unpack(format_str, data)
... manipulate the data
new_data = struct.pack(format_str, *tuple_of_data)
без этой возможности вы были бы вынуждены писать
new_data = struct.pack(format_str, tuple_of_data[0], tuple_of_data[1], tuple_of_data[2],...)
что также означает, что если format_str изменится и размер кортежа изменится, мне придется вернуться и отредактировать эту очень длинную строку
.Вы можете посмотреть документацию по python (docs.python.org в FAQ) , но, более конкретно, для хорошего объяснения таинственных ошибок miss args и mister kwargs (любезно предоставлено archive.org) (исходная, неработающая ссылка здесь ).
Вкратце, оба используются, когда используются необязательные параметры функции или метода. Как говорит Дейв, * args используется, когда вы не знаете, сколько аргументов может быть передано, и ** kwargs, когда вы хотите обрабатывать параметры, указанные по имени и значению, как в:
myfunction(myarg=1)
Вот пример, в котором используются 3 разных типа параметров.
def func(required_arg, *args, **kwargs):
# required_arg is a positional-only parameter.
print required_arg
# args is a tuple of positional arguments,
# because the parameter name has * prepended.
if args: # If args is not empty.
print args
# kwargs is a dictionary of keyword arguments,
# because the parameter name has ** prepended.
if kwargs: # If kwargs is not empty.
print kwargs
>>> func()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: func() takes at least 1 argument (0 given)
>>> func("required argument")
required argument
>>> func("required argument", 1, 2, '3')
required argument
(1, 2, '3')
>>> func("required argument", 1, 2, '3', keyword1=4, keyword2="foo")
required argument
(1, 2, '3')
{'keyword2': 'foo', 'keyword1': 4}
Эти параметры обычно используются для функций прокси, поэтому прокси может передавать любой входной параметр целевой функции.
def foo(bar=2, baz=5):
print bar, baz
def proxy(x, *args, **kwargs): # reqire parameter x and accept any number of additional arguments
print x
foo(*args, **kwargs) # applies the "non-x" parameter to foo
proxy(23, 5, baz='foo') # calls foo with bar=5 and baz=foo
proxy(6)# calls foo with its default arguments
proxy(7, bar='asdas') # calls foo with bar='asdas' and leave baz default argument
Но поскольку эти параметры скрывают фактические имена параметров, их лучше избегать.