Я пытаюсь найти элегантный питонический способ решить следующую проблему. У меня есть класс VideoAnalysisWidget
, который создает целую кучу дочерних виджетов, таких как VideoFileChoiceWidget
, RegionWidget
и т. д. Я хочу, чтобы VideoAnalysisWidget.__init__
передал любые соответствующие аргументы ключевого слова в VideoFileChoiceWidget.__init__
, RegionWidget.__init__
,... Для этого я хотел бы использовать код как следующее:
import inspect
def filterArgs(func, **kwargs):
spec = inspect.getargspec(func)
ks = set(kwargs.keys())
ks.discard('self')
kinc = ks & set(spec.args)
kexc = ks - set(spec.args)
inc = {k: kwargs[k] for k in kinc}
exc = {k: kwargs[k] for k in kexc}
return(inc, exc)
Потом в другом месте:
def __init__(self, **kwargs):
(fcwArgs, otherArgs) = filterArgs(VideoFileChoiceWidget.__init__, **kwargs)
fcw = VideoFileChoiceWidget(**fcwArgs)
...
При таком подходе мой код для VideoAnalysisWidget
не должен отслеживать список аргументов VideoFileChoiceWidget
. Если позже я пересмотрю VideoFileChoiceWidget
, чтобы принять новый аргумент, мне не нужно будет вносить изменения в удаленный код VideoAnalysisWidget
.
Теперь вот проблема. Это прекрасно работает, если VideoFileChoiceWidget
имеет только явно определенные параметры ключевого слова. (Кстати, я согласен не использовать никаких позиционных параметров, кроме self
, для любой из этих функций.) Но что, если VideoFileChoiceWidget
также имеет аргумент **kwargs
? На самом деле это так, потому что он является подклассом ContainerWidget
, поэтому я хочу передать ему любые дополнительные дополнительные аргументы. (И ContainerWidget
занимает ТОЛЬКО **kwargs
.) По сути, проблема в том, что это мое решение не может быть вложенным.
Возможным решением было бы присоединить список дополнительных аргументов к VideoFileChoiceWidget.__init__
, например:
VideoFileChoiceWidget.__init__._args = ['description', 'visible', 'children']
... затем измените filterArgs
, чтобы использовать его, если он доступен. Но есть ли лучший, более питонический способ сделать это?
inspect
, но в этих случаях обычно я группирую множество kwargs в класс и передаю его. - person simonzack   schedule 23.11.2014