Использование * args и ** kwargs [дубликаты]

Но как я могу ничего сохранить до 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.

1324
задан Siddharth Satpathy 4 December 2018 в 04:33
поделиться

10 ответов

Синтаксис - это * и **. Имена *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

Как вы можете видеть, в данном случае она берет список (или кортеж) элементов и распаковывает его. Тем самым он сопоставляет их с аргументами в функции. Конечно, вы можете иметь * как в определении функции, так и в вызове функции.

1637
ответ дан 19 December 2019 в 20:15
поделиться

Вот одно из моих любимых мест использования синтаксиса **, как в последнем примере Дейва Вебба:

mynum = 1000
mystr = 'Hello World!'
print "{mystr} New-style formatting is {mynum}x more fun!".format(**locals())

Я не уверен, что это очень быстро по сравнению с просто использованием самих имен, но набирать текст намного легче!

71
ответ дан 19 December 2019 в 20:15
поделиться

Одно из мест, где использование *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.

476
ответ дан 19 December 2019 в 20:15
поделиться

Один случай, когда * 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
45
ответ дан 19 December 2019 в 20:15
поделиться

*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.

36
ответ дан 19 December 2019 в 20:15
поделиться

Представьте, что у вас есть функция, но вы не хотите ограничивать количество принимаемых ею параметров. Пример:

>>> import operator
>>> def multiply(*args):
...  return reduce(operator.mul, args)

Затем вы используете эту функцию, например:

>>> multiply(1,2,3)
6

or

>>> numbers = [1,2,3]
>>> multiply(*numbers)
6
18
ответ дан 19 December 2019 в 20:15
поделиться

Названия *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 изменится и размер кортежа изменится, мне придется вернуться и отредактировать эту очень длинную строку

.
17
ответ дан 19 December 2019 в 20:15
поделиться

Вы можете посмотреть документацию по python (docs.python.org в FAQ) , но, более конкретно, для хорошего объяснения таинственных ошибок miss args и mister kwargs (любезно предоставлено archive.org) (исходная, неработающая ссылка здесь ).

Вкратце, оба используются, когда используются необязательные параметры функции или метода. Как говорит Дейв, * args используется, когда вы не знаете, сколько аргументов может быть передано, и ** kwargs, когда вы хотите обрабатывать параметры, указанные по имени и значению, как в:

myfunction(myarg=1)
3
ответ дан 19 December 2019 в 20:15
поделиться

Вот пример, в котором используются 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}
309
ответ дан 19 December 2019 в 20:15
поделиться

Эти параметры обычно используются для функций прокси, поэтому прокси может передавать любой входной параметр целевой функции.

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

Но поскольку эти параметры скрывают фактические имена параметров, их лучше избегать.

8
ответ дан 19 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: