Difference between dir(…) and vars(…).keys() in Python?

前端 未结 3 2134
余生分开走
余生分开走 2020-12-07 08:59

Is there a difference between dir(…) and vars(…).keys() in Python?

(I hope there is a difference, because otherwise this would break the \"

3条回答
  •  一整个雨季
    2020-12-07 09:40

    The documentation has this to say about dir:

    Without arguments, return the list of names in the current local scope. With an argument, attempt to return a list of valid attributes for that object.

    And this about vars:

    Without arguments, return a dictionary corresponding to the current local symbol table. With a module, class or class instance object as argument (or anything else that has a __dict__ attribute), returns a dictionary corresponding to the object’s symbol table.

    If you don't see the difference, maybe this will show you more:

    >>> dir(list)
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delsli
    ce__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getit
    em__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__',
     '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__r
    educe__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__'
    , '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'a
    ppend', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'
    ]
    >>> vars(list).keys()
    ['__getslice__', '__getattribute__', 'pop', 'remove', '__rmul__', '__lt__', '__s
    izeof__', '__init__', 'count', 'index', '__delslice__', '__new__', '__contains__
    ', 'append', '__doc__', '__len__', '__mul__', 'sort', '__ne__', '__getitem__', '
    insert', '__setitem__', '__add__', '__gt__', '__eq__', 'reverse', 'extend', '__d
    elitem__', '__reversed__', '__imul__', '__setslice__', '__iter__', '__iadd__', '
    __le__', '__repr__', '__hash__', '__ge__']
    

    If you don't feel like reading through that, dir includes these attributes while vars does not:

    >>> set(dir(list)).difference(vars(list).keys())
    set(['__str__', '__reduce__', '__subclasshook__', '__setattr__', '__reduce_ex__'
    , '__format__', '__class__', '__delattr__'])
    

提交回复
热议问题