Это класс, который у меня есть:
class metadict(dict):
def __init__(self, do_something=False, *args, **kwargs)
if do_something:
pass
super(metadict,self).__init__(*args,**kwargs)
Идея состоит в том, чтобы инкапсулировать словарь и добавить некоторые функции с помощью специального ключевого слова. Словарь все еще может содержать do_something
, хотя вы не можете добавить его во время создания. Во всех остальных аспектах он ведет себя как обычный словарь.
В любом случае, проблема в том, что все, что я даю args
, начинается с присвоения первого значения do_something
, чего я не хочу.
Что я делаю сейчас, так это:
class metadict(dict):
def __init__(self, do_something=False, *args, **kwargs)
if not isinstance(do_something, bool):
args = list(args)
args.append(do_something)
elif do_something:
pass
super(metadict,self).__init__(*args,**kwargs)
Но мне это кажется неправильным. Я мог бы также проверить значение do_something
в kwargs, но это будет хуже, так как я возился с подписью, удаляя полезную информацию...
Есть ли способ в python безопасно использовать необязательные, позиционные и ключевые аргументы? Если нет, есть ли другие более простые обходные пути?
у меня питон 2.6
do_something
является ключевым словом,*args
является позиционным). Затем, когда вы передаете значение в качестве первого элемента в конструкторе, оно передается вdo_something
. Попробуйте поставитьdo_something
после*args
. - person RocketDonkey   schedule 03.12.2012*args
(поэтому вместо этого используюargs
). Затем вы можете поставитьdo_something=False
послеargs
, сделав свою подписьself, args, do_something=False, **kwargs
. Затем, когда вы вызываетеsuper
, используйте.__init__(args, **kwargs)
. * Это не работает, если вы используете синтаксисdict(one=1, two=2)
, поскольку он основан на передаче итерации, которая затем распаковывается самим классомdict
. Опять же, ужасное решение, но если вы в отчаянии... :) - person RocketDonkey   schedule 04.12.2012