Можно ли перечислить аргументы ключевого слова, которые получает функция?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

98
задан martineau 26 July 2018 в 01:53
поделиться

4 ответа

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

>>> import inspect
>>> def func(a,b,c=42, *args, **kwargs): pass
>>> inspect.getargspec(func)
(['a', 'b', 'c'], 'args', 'kwargs', (42,))

, Если Вы хотите знать, нужен ли его вызываемое с определенным набором args, Вам args без значения по умолчанию, уже определенного. Они могут быть получены:

def getRequiredArgs(func):
    args, varargs, varkw, defaults = inspect.getargspec(func)
    if defaults:
        args = args[:-len(defaults)]
    return args   # *args and **kwargs are not required, so ignore them.

Тогда функция для сообщения, что Вы пропускаете от своего конкретного dict:

def missingArgs(func, argdict):
    return set(getRequiredArgs(func)).difference(argdict)

Точно так же для проверки на недопустимый args используйте:

def invalidArgs(func, argdict):
    args, varargs, varkw, defaults = inspect.getargspec(func)
    if varkw: return set()  # All accepted
    return set(argdict) - set(args)

И таким образом, полный тест, если это является вызываемым:

def isCallableWithArgs(func, argdict):
    return not missingArgs(func, argdict) and not invalidArgs(func, argdict)

(Это хорошо только до парсинга аргумента Python. Любые проверки на этапе выполнения на недопустимые значения в kwargs, очевидно, не могут быть обнаружены.)

143
ответ дан Brian 24 November 2019 в 05:15
поделиться

Это будет расшифровка подписи всех проходимых аргументов, ключевого слова и неключевого слова:

def func(one, two="value"):
    y = one, two
    return y
print func.func_code.co_varnames[:func.func_code.co_argcount]

Это вызвано тем, что сначала co_varnames всегда параметры (затем локальные переменные, как y в примере выше).

Поэтому теперь у Вас могла быть функция:

def getValidArgs(func, argsDict):
    '''Return dictionary without invalid function arguments.'''
    validArgs = func.func_code.co_varnames[:func.func_code.co_argcount]
    return dict((key, value) for key, value in argsDict.iteritems() 
                if key in validArgs)

, Который Вы тогда могли использовать как это:

>>> func(**getValidArgs(func, args))
<час>

РЕДАКТИРОВАНИЕ : маленькое дополнение: если Вы действительно потребность только аргументы ключевого слова из функции, можно использовать эти func_defaults атрибут для извлечения их:

def getValidKwargs(func, argsDict):
    validArgs = func.func_code.co_varnames[:func.func_code.co_argcount]
    kwargsLen = len(func.func_defaults) # number of keyword arguments
    validKwargs = validArgs[-kwargsLen:] # because kwargs are last
    return dict((key, value) for key, value in argsDict.iteritems() 
                if key in validKwargs)

Вы могли теперь вызвать свою функцию с известным args, но извлеченный kwargs, например:

func(param1, param2, **getValidKwargs(func, kwargsDict))

Это предполагает что func использование никакой *args или **kwargs волшебство в его подписи.

31
ответ дан DzinX 24 November 2019 в 05:15
поделиться

В Python 3.0:

>>> import inspect
>>> import fileinput
>>> print(inspect.getfullargspec(fileinput.input))
FullArgSpec(args=['files', 'inplace', 'backup', 'bufsize', 'mode', 'openhook'],
varargs=None, varkw=None, defaults=(None, 0, '', 0, 'r', None), kwonlyargs=[], 
kwdefaults=None, annotations={})
6
ответ дан jfs 24 November 2019 в 05:15
поделиться

Расширение ответа DzinX:

argnames = example.func_code.co_varnames[:func.func_code.co_argcount]
args = dict((key, val) for key,val in d_args.iteritems() if key in argnames)
example(**args)
3
ответ дан Claudiu 24 November 2019 в 05:15
поделиться
Другие вопросы по тегам:

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