代码之家  ›  专栏  ›  技术社区  ›  igorgue

从一个方法中得到一个dict?

  •  1
  • igorgue  · 技术社区  · 16 年前

    我想找一份工作 dict 对于一个方法,到目前为止,我能够获得方法名和它的参数(使用inspect模块),我面临的问题是我也希望有默认参数(或参数类型)。

    这基本上是我的单元测试:

    class Test:
        def method1(anon_type, array=[], string="string", integer=12, obj=None):
            pass
    
    target = {"method1": [
                 {"anon": "None"}, 
                 {"array": "[]"}, 
                 {"string": "str"}, 
                 {"integer": "int"},
                 {"obj": "None"}]
             }
    method1_dict = get_method_dict(Test().method1)
    
    self.assertEqual(target, method1_dict)
    

    检查 要获取方法,请执行以下操作:

    >>> import inspect
    >>> class Class:
    ...     def method(self, string='str', integer=12):
    ...             pass
    ... 
    >>> m_desc = inspect.getargspec(Class().method)
    >>> m_desc
    ArgSpec(args=['self', 'string', 'integer'], varargs=None, keywords=None, defaults=('str', 12))
    >>>
    

    但我的问题在于 默认参数 ,正如你在这里看到的:

    >>> class Class:
    ...     def method(self, no_def_args, string='str', integer=12):
    ...             pass
    ... 
    >>> m_desc = inspect.getargspec(Class().method)
    >>> m_desc
    ArgSpec(args=['self', 'no_def_args', 'string', 'integer'], varargs=None, keywords=None, defaults=('str', 12))
    

    正如你看到的 no_def_args 不在默认值中,因此尝试将参数与其默认参数匹配是一个问题。

    2 回复  |  直到 16 年前
        1
  •  2
  •   SilentGhost    16 年前

    到底是什么问题?所有参数都是有序的,关键字参数应该是定义中的最后一个参数。你知道如何切分一张名单吗?

        2
  •  1
  •   Nadia Alramli    16 年前

    以下是我通常做的:

    import inspect, itertools
    args, varargs, keywords, defaults = inspect.getargspec(method1)
    print dict(itertools.izip_longest(args[::-1], defaults[::-1], fillvalue=None))
    

    --&燃气轮机;

    {'integer': 12, 'array': [], 'anon_type': None, 'obj': None, 'string': 'string'}
    

    这只适用于python2.6