Re: proposal: PL/Pythonu - function ereport
От | Catalin Iacob |
---|---|
Тема | Re: proposal: PL/Pythonu - function ereport |
Дата | |
Msg-id | CAHg_5gp1w=-9su_6wN9Zv2NCU_p+XXxztnBfq-YF_h4sz2RYCQ@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: proposal: PL/Pythonu - function ereport (Pavel Stehule <pavel.stehule@gmail.com>) |
Ответы |
Re: proposal: PL/Pythonu - function ereport
|
Список | pgsql-hackers |
On Wed, Feb 17, 2016 at 3:32 PM, Pavel Stehule <pavel.stehule@gmail.com> wrote: >> Python 3 has keyword only arguments. It occurs to me they're exactly >> for "optional extra stuff" like detail, hint etc. >> Python 2 doesn't have that notion but you can kind of fake it since >> you get an args tuple and a kwargs dictionary. > > > I prefer a possibility to use both ways - positional form is shorter, > keywords can help with some parameters. > > But I cannot to imagine your idea, can you show it in detail? Sure, what I mean is: plpy.error('msg') # as before produces message 'msg' plpy.error(42) # as before produces message '42', including the conversion of the int to str plpy.error('msg', 'arg 2 is still part of msg') # as before, produces message '('msg', 'arg2 is still part of msg')' # and so on for as many positional arguments, nothing changes # I still think allowing more than one positional argument is unfortunate but for compatibility we keep allowing more # to pass detail you MUST use keyword args to disambiguate "I really want detail" vs. "I have argument 2 which is part of the messsage tuple for compatibility" plpy.error('msg', 42, detail='a detail') # produces message '('msg', 42)' and detail 'a detail' plpy.error('msg', detail=77) # produces message 'msg' and detail '77' so detail is also converted to str just like message for consistency # and so on for the others plpy.error('msg', 42, detail='a detail', hint='a hint') plpy.error('msg', 42, schema='sch') Only keyword arguments are treated specially and we know no existing code has keyword arguments since they didn't work before. Implementation wise, it's something like this but in C: def error(*args, **kwargs): if len(args) == 1: message = str(args[0]) else: message = str(args) # fetch value from dictionary or None if the key is missing detail = kwargs.pop('detail', None) hint = kwargs.pop('hint',None) # use message, detail, hint etc. to raise exception for error and fatal/call ereport for the other levels Is it clear now? What do you think?
В списке pgsql-hackers по дате отправления: