py2 и py3, чтобы заменить расширенную распаковку (* args) в функции [duplicate]

В течение определенного времени повторение - например, выключение компьютеров - это определенное время каждый день. используйте cron.

crontab -e

добавьте следующее:

15 14 1 * * pmi action suspend

Если вы хотите настроить его.

* * * * * command to be executed
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

Для одноразовой работы нам команда

Например, если вы хотите спящий режим за 30 минут:

echo 'pmi action hibernate' | at now + 30 min

Или если вы хотите приостановить работу в 11:00 вечера:

echo 'pmi action suspend' | at 11pm
57
задан 2 May 2018 в 02:07

4 ответа

Другой способ справиться с Python 2.x:

def foo(*args, **kwargs):
    if < kwarg-name > not in kwargs.keys():
        kwargs[< kwarg-name >] = < kwarg-name-default-value >
    return bar(*args, **kwargs)

Это обрабатывает передачу произвольного *args базовому вызову в отличие от ответа @ nneonneo.

1
ответ дан 15 August 2018 в 14:46

Вы также можете использовать декоратор, подобный этому:

import functools
def default_kwargs(**defaultKwargs):
    def actual_decorator(fn):
        @functools.wraps(fn)
        def g(*args, **kwargs):
            defaultKwargs.update(kwargs)
            return fn(*args, **defaultKwargs)
        return g
    return actual_decorator

Затем просто выполните:

@default_kwargs(defaultVar1 = defaultValue 1, ...)
def foo(*args, **kwargs):
    # Anything in here

Например:

@default_kwargs(a=1)
def f(*args, **kwargs):
    print(kwargs['a']+ 1)

f() # Returns 2
f(3) # Returns 4
0
ответ дан 15 August 2018 в 14:46

Синтаксис в другом вопросе - только python3.x и указывает только аргументы ключевого слова. Это не работает на python2.x.

Для python2.x я бы pop из kwargs:

def func(arg1, arg2, *args, **kwargs):
    opt_arg = kwargs.pop('opt_arg', 'def_val')
45
ответ дан 15 August 2018 в 14:46
  • 1
    Он также указывает * args, перед аргументом по умолчанию. – user 9 March 2013 в 01:56

Приближаясь к вашему решению, пытаясь сделать его более общим и более компактным, я бы предложил рассмотреть примерно следующее:

>>> def func(arg1, arg2, *args, **kwargs):
...     kwargs_with_defaults = dict({'opt_arg': 'def_val', 'opt_arg2': 'default2'}, **kwargs)
...     #...
...     return arg1, arg2, args, kwargs_with_defaults

>>> func('a1', 'a2', 'a3', 'a5', x='foo', y='bar')
('a1', 'a2', ('a3', 'a5'), {'opt_arg2': 'default2', 'opt_arg': 'def_val', 'y': 'bar', 'x': 'foo'})

>>> func('a1', 'a2', 'a3', 'a5', opt_arg='explicit_value', x='foo', y='bar')
('a1', 'a2', ('a3', 'a5'), {'opt_arg2': 'default2', 'opt_arg': 'explicit_value', 'y': 'bar', 'x': 'foo'})
1
ответ дан 15 August 2018 в 14:46

Другие вопросы по тегам:

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