Определите, был ли именованный параметр передан

Сначала нужно проверить совпадение, а затем использовать группы. Т.е.

  • компилируют регулярные выражения (необязательно для большинства случаев в настоящее время, согласно документации)
  • применяют каждое регулярное выражение к строке, чтобы сгенерировать объект соответствия
    • match() совпадения только в начало строки, т. е. с неявным ^ якорем
    • search() совпадает в любом месте строки
  • проверять, является ли объект сопоставления действительным
    • извлекать группы
    • переходить к следующей итерации цикла
# works with Python 2 and Python 3
import re

with open('dummy.txt', 'r') as fh:
    for rec in fh:
        orec = '    rec: >' + rec.rstrip('\n') + '<'
        print(orec)

        match = re.match(r'XA([0-9]+)=(.*?[^#])!', rec)
        if match:
            (index, dvalue) = match.groups()
            print("    index = >{}<  value = >{}<".format(index, dvalue))
            continue

        match = re.match(r'PZ([0-9]+)=(.*?[^#])!', rec)
        if match:
            (index, dvalue) = match.groups()
            print("    index = >{}<  value = >{}<".format(index, dvalue))
            continue

        print("    Unknown Record format")

Вывод:

$ python dummy.py
    rec: >DUD=ABC!QUEUE=D23!<
    Unknown Record format
    rec: >XA32=7!P^=32!<
    index = >32<  value = >7<
    rec: >PZ112=123^!PQ=ABC!<
    index = >112<  value = >123^<

Но Мне интересно, почему вы не упрощаете свой Perl & amp; код Python просто использовать один регулярное выражение, вместо этого? E.g.:

match = re.match(r'(?:XA|PZ)([0-9]+)=(.*?[^#])!', rec)
if match:
    (index, dvalue) = match.groups()
    print("    index = >{}<  value = >{}<".format(index, dvalue))
else:
    print("    Unknown Record format")
14
задан ddaa 1 November 2008 в 02:58
поделиться

5 ответов

Я предполагаю, что Вы имеете в виду "аргумент ключевого слова", когда Вы говорите "названный параметром". dict.pop() не принимает аргумент ключевого слова, таким образом, эта часть вопроса спорна.

>>> {}.pop('test', d=None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pop() takes no keyword arguments

Тем не менее способ обнаружить, был ли аргумент обеспечен, состоит в том, чтобы использовать *args или **kwargs синтаксис. Например:

def foo(first, *rest):
    if len(rest) > 1:
        raise TypeError("foo() expected at most 2 arguments, got %d"
                        % (len(rest) + 1))
    print 'first =', first
    if rest:
        print 'second =', rest[0]

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

8
ответ дан 1 December 2019 в 12:02
поделиться

Конвенция состоит в том, чтобы часто использовать arg=None и использование

def foo(arg=None):
    if arg is None:
        arg = "default value"
        # other stuff
    # ...

, чтобы проверить, было ли это передано или нет. Разрешение пользователю передать None, который был бы интерпретирован, как будто аргумент был не , передало.

12
ответ дан 1 December 2019 в 12:02
поделиться

Можно сделать это как это:

def isdefarg(*args):
    if len(args) > 0:
        print len(args), "arguments"
    else:
        print "no arguments"

isdefarg()
isdefarg(None)
isdefarg(5, 7)

См. документацию Python относительно вызовы для полной информации.

2
ответ дан 1 December 2019 в 12:02
поделиться
def f(one, two=2):
   print "I wonder if", two, "has been passed or not..."

f(1, 2)

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

2
ответ дан 1 December 2019 в 12:02
поделиться

Я не уверен, понимаю ли я полностью то, что это, Вы хотите; однако:

def fun(arg=Ellipsis):
    if arg is Ellipsis:
        print "No arg provided"
    else:
        print "arg provided:", repr(arg)

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

1
ответ дан 1 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

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