Вход Python с помощью декоратора

Как насчет возвращаемых переменных?

Я особенно затрудняюсь при реализации хранимых процедур.

Представьте следующую хранимую процедуру (неверный синтаксис, я знаю, просто чтобы показать пример) :

int procGetIdCompanyByName(string companyName);

Он возвращает идентификатор компании, если он существует в конкретной таблице. В противном случае он возвращает -1. Как-то это волшебное число. Некоторые из рекомендаций, которые я читал до сих пор, говорят, что мне действительно нужно будет сделать что-то подобное:

int procGetIdCompanyByName(string companyName, bool existsCompany);

Кстати, что он должен вернуть, если компания не существует? Ok: он установит existesCompany как false, но также вернет -1.

Функция Antoher состоит в том, чтобы сделать две отдельные функции:

bool procCompanyExists(string companyName);
int procGetIdCompanyByName(string companyName);

So предварительным условием для второй хранимой процедуры является то, что компания существует.

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

Суть заключается в следующем: что вы думаете об использовании таких «волшебных чисел», которые относительно известны и безопасны, чтобы сказать, что что-то не увенчалось успехом или что-то не существует?

25
задан S.Lott 30 October 2009 в 11:16
поделиться

2 ответа

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

Позвольте мне объяснить: позиционные аргументы, a и b в вашем случае, являются обязательными (и могут иметь значения по умолчанию). Другие аргументы необязательны. Если вы хотите сделать аргумент обязательным или иметь значение по умолчанию, поставьте его перед * args и ** kwargs. Но помните, что вы не можете предоставить аргумент дважды:

def x(a = 1, b = 2, *args, **kwargs):
    print a, b, args, kwargs

>>> x(3, 4, 5, b=6)
TypeError: x() got multiple values for keyword argument 'b'

Есть другой способ, но не настолько удобочитаемый, иметь значения по умолчанию для аргументов и не иметь позиционных аргументов:

def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})

Ваша функция, которая анализирует аргументы, в порядке, хотя я не понимаю, почему вы пишете varargs и keywords в _. Он передает аргументы прозрачно:

def x(a = 1, b = 2, *args, **kwargs):
    print a, b, args, kwargs

def y(*args, **kwargs):
    x(*args, **kwargs)

>>> y(3, 4, 5, 6)
3 4 (5, 6) {}

>>> y(3, 4, 5, b=6)
TypeError: x() got multiple values for keyword argument 'b'
1
ответ дан culebrón 16 October 2019 в 07:20
поделиться

Единственное, что я заметил, это то, что конструкция dict ((varList [i], v) for i, v in enumerate (argt)) , которую вы использовали дважды, на самом деле dict (zip (varList, argt)) .

Кроме этого, у меня есть только мета-критика: Ничего из вышеперечисленного не помещается в файл журнала.

Вместо того, чтобы просматривать журналы до

  • , проверять, вызываются ли функции с правильными аргументами, вы используете утверждения и отладчик.
  • посмотрите, вернет ли функция правильные результаты, которые вы пишете в модульных тестах.
5
ответ дан 28 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

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