Есть ли способ сказать, что функция Python получила значение по умолчанию или параметр ключевого слова? - PullRequest
4 голосов
/ 28 февраля 2012
def func(a, b = 100):
  return a + b

func(a)
func(a,b = 100)

Есть ли способ узнать, когда вызывается func, значение b взято из параметра по умолчанию или ключевого слова?

Ответы [ 6 ]

4 голосов
/ 28 февраля 2012

Анонимный объект - это способ охватить все возможные случаи.

def foo(a, b=object()):
    if b is foo.func_defaults[0]:
         # no value was passed
    # do whatever
4 голосов
/ 28 февраля 2012

Нет, не так, как вы написали свой код. Тем не менее, вы можете сделать:

def func(a, b=None):
    if b is None:
        b = 100
    return a + b
2 голосов
/ 28 февраля 2012

Это не совсем дело Фанка, знать.Но вы можете по умолчанию None.

def func(a, b=None):
  if b is None:
    # b = default b
    b = 100
  return a + b
1 голос
/ 28 февраля 2012

Вы можете использовать объект в качестве значения по умолчанию, например,

dummy = object()

def func(a, b=dummy):
  used_default = b is dummy
  if used_default:
    b = 100
  print used_default

func(0)           # prints True
func(0, None)     # prints False
func(0, object()) # prints False
0 голосов
/ 28 февраля 2012

Альтернативой другим предложениям является использование параметра kwargs, а затем сделать что-то вроде этого:

def func(a, **kwargs):
if 'b' in kwargs:
    print 'b was passed in'
    b = kwargs['b']
else:
    print 'b was not passed in'
    b = 100

return a + b


a = 50
func(a)
func(a, b = 100)

Вывод:

b was not passed in
150
b was passed in
150

Поскольку kwargs являетсясловарь, содержащий все необязательные параметры, вы можете проверить этот словарь, чтобы определить, что было / не было передано.

Вы можете сделать поиск b более эффективным, вместо того, чтобы искать kwargs дважды, если это необходимо.

0 голосов
/ 28 февраля 2012

Если вы намерены проверить, соответствует ли b значение по умолчанию , не используйте значение по умолчанию!Если вам абсолютно необходимо оставить b необязательным, передайте специальное значение (возможно, -1), чтобы обозначить необычный случай, и обязательно отметьте это в своем __doc__.Просто убедитесь, что вы не можете достичь исключительного значения в любом повседневном использовании, и что исключения, написанные для этой логики, не изменяют чувствительные области вашего кода.

...