【问题标题】:Viewing all defined variables [duplicate]查看所有定义的变量 [重复]
【发布时间】:2009-03-11 02:32:55
【问题描述】:

我目前正在 python shell 中进行计算。我想要的是 Matlab 样式的列表,您可以在其中看到所有已定义的变量(因此我知道我使用了哪些名称、它们的值等)。

有没有办法,我该怎么做?

【问题讨论】:

  • 我正在根据船级社的规则来确定某些结构的尺寸。所以所有的厚度都是 t,长度是 L 等等。有时它们会互相调用,所以 t 在第 7.2.4 章中使用。使用 3.2.2 中的 t。它是一次性计算,所以我只使用 py 作为交互式 shell。
  • 其他问题似乎更笼统?
  • 可能值得一提:Spyder 有一个出色的变量浏览器,可能正是您正在寻找的。​​span>

标签: python variables


【解决方案1】:

你可以使用的一些东西:

  • dir() 将为您提供范围内变量的列表:
  • globals() 会给你一个全局变量字典
  • locals() 会给你一个局部变量字典

【讨论】:

  • 当我运行globals()print(globals()) 时。我收到TypeError: __repr__ returned non-string (type NoneType) 知道为什么吗?
  • 我认为如果定义了一个全局变量错误地实现了 repr 方法(即不返回字符串),就会发生这种情况。
【解决方案2】:

如果可能,您可能想使用IPython

为了获得所有当前用户定义变量的列表,IPython 提供了一个名为who魔法命令(魔法必须以% 字符为前缀,除非启用了automagic 功能):

In [1]: foo = 'bar'
In [2]: %who
foo

您可以使用whos 魔法来获取更多详细信息:

In [3]: %whos
Variable   Type    Data/Info
----------------------------
foo        str     bar

还有很多其他可用的魔法。 IPython 基本上是类固醇上的 Python 解释器。一种方便的魔法是store,它可以让您在会话之间保存变量(使用pickle)。

注意:我与 IPython Dev 无关 - 只是一个满意的用户。

编辑:

你可以在IPython Documentation找到所有的魔法命令。

This article 也有关于在 Jupyter Notebook 中使用魔法命令的有用部分

【讨论】:

  • +1,但希望我能投票 +10:IPython 的 %who 从 locals() 中删除非用户变量!
  • 这个答案是半有用的,因为如果有人不太了解 IPython,他们不会知道他们需要打开 automagic 才能使您的命令正常工作。默认情况下,他们需要在魔术命令前面加上 %,例如%who
  • 我编辑了答案,提到who 仅显示用户定义的变量,并解决了automagic 问题。
  • 澄清一下,pickle 也可以作为 IPython 之外的常规包使用。很有用!
【解决方案3】:

打印本地人()

编辑从评论继续。

为了让它在打印时看起来更漂亮:

import sys, pprint
sys.displayhook = pprint.pprint
locals()

这应该会给你一个更垂直的打印输出。

【讨论】:

  • 嗨。这可能会奏效。有没有办法让它以相对“垂直的方式”打印出来。一个接一个地刷新它并不是很有帮助,特别是当有大约 300 个变量时。
  • 当然,试试这个:import sys, pprint sys.displayhook = pprint.pprint locals()
  • 哎呀,格式不太好。我会把它添加到我的答案中。
  • 或者form pprint import pprint,然后用pprint代替print
  • +1 用于 sys.displayhook。非常感谢!
【解决方案4】:

更聪明一点(python 3)的方式:

def printvars():

   tmp = globals().copy()
   [print(k,'  :  ',v,' type:' , type(v)) for k,v in tmp.items() if not k.startswith('_') and k!='tmp' and k!='In' and k!='Out' and not hasattr(v, '__call__')]

或者如果你想输出一个对象的变量:

def printObj(Obj, OutputMax=100):

   tmp = Obj.__dict__
   [print(k,'  :  ',str(v)[:OutputMax],' type:' , type(v)) for k,v in tmp.items() if not k.startswith('_') and k!='tmp' and k!='In' and k!='Out' and not hasattr(v, '__call__')]

【讨论】:

    【解决方案5】:

    要获取名称:

    for name in vars().keys():
      print(name)
    

    获取值:

    for value in vars().values():
      print(value)
    

    vars() 还接受一个可选参数来找出在对象本身中定义了哪些变量。

    【讨论】:

      【解决方案6】:

      globals()locals()vars()dir() 都可以为您提供所需的帮助。

      【讨论】:

        【解决方案7】:

        正如 RedBlueThing 和类比所说:

        • dir() 给出范围内变量的列表
        • globals() 给出了一个全局变量字典
        • locals() 提供局部变量字典

        使用交互式shell(2.6.9版),在创建变量a = 1b = 2后,运行dir()给出

        ['__builtins__', '__doc__', '__name__', '__package__', 'a', 'b']
        

        运行locals() 给出

        {'a': 1, 'b': 2, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None}
        

        在这种情况下,运行 globals() 给出的答案与 locals() 完全相同。

        我还没有进入任何模块,所以所有变量都可以作为局部变量和全局变量使用。 locals()globals() 列出变量的值以及名称; dir() 只列出名字。

        如果我导入一个模块并在模块内运行locals()globals()dir() 仍然只给出少量变量;它将__file__ 添加到上面列出的变量中。 locals()globals() 也列出了相同的变量,但在打印出 __builtin__ 的字典值的过程中,它列出了更多的变量:内置函数、异常和类型,例如“@ 987654347@",而不仅仅是上面显示的简短的&lt;module '__builtin__' (built-in)&gt;

        有关 dir() 的更多信息,请参阅 New Mexico Tech 的 Python 2.7 quick reference 或 ibiblio.org 的 the dir() function

        有关 locals()globals() 的更多信息,请参阅 Dive Into Python 的 locals and globals 和 New Mexico Tech 的有关 globals 的页面。

        [评论:@Kurt:您提供了指向enumerate-or-list-all-variables-in-a-program-of-your-favorite-language-here 的链接,但该答案有误。问题是:type(name) 在该示例中将始终返回&lt;type 'str'&gt;。您确实得到了一个变量列表,它回答了问题,但在它们旁边列出了不正确的类型。这在您的示例中并不明显,因为所有变量都恰好是字符串;但是,它返回的是变量名称的类型,而不是变量的类型。要解决此问题:请使用 print eval('type(' + name + ')') 而不是 print type(name)。我很抱歉在答案部分发表评论,但我没有发表评论的权限,其他问题已关闭。]

        【讨论】:

        • 使用 eval() 的最后一条评论是正确的方法。谢谢。
        【解决方案8】:

        这必须在交互式 shell 中定义:

        def MyWho():
            print [v for v in globals().keys() if not v.startswith('_')]
        

        那么下面的代码可以作为例子:

        >>> import os
        >>> import sys
        >>> a = 10 
        >>> MyWho()
        ['a', 'MyWho', 'sys', 'os']
        

        【讨论】:

          【解决方案9】:

          记住 dir() 将返回所有当前的导入,AND 变量。

          如果你只想要你的变量,我会建议一个易于从 dir 中提取的命名方案,例如 varScore、varNames 等。

          这样,您可以简单地这样做:

          for vars in dir():
           if vars.startswith("var"):
             print vars
          

          编辑

          如果要列出所有变量,但排除导入的模块和变量,例如:

          __builtins__
          

          你可以这样使用:

          import os
          import re
          
          x = 11
          imports = "os","re"
          
          for vars in dir():
              if vars.startswith("__") == 0 and vars not in imports:
                  print vars
          

          如您所见,它会显示变量“imports”,因为它是一个变量(嗯,一个元组)。一个快速的解决方法是将单词“imports”添加到导入元组本身!

          【讨论】:

          • 嗯,不,恐怕这不可能。他们中的大多数只是t,a,c,d,L,p......等等。
          • 啊,我猜是一个小项目?一旦你达到 1k+ LOC 并且你必须记住每个变量所包含的内容,我会发疯地使用单个字符变量制作大型项目......它会令人沮丧。
          • 我猜这将是大约 300 pg 的报告,所以它大约有 2000 个变量(这个的厚度,那个的厚度,我什至不知道它是什么的东西的厚度...... :) ...是的。
          【解决方案10】:

          在我的 Python 2.7 解释器中,存在于 MATLAB 中的相同 whos 命令也存在于 Python 中。它显示与 MATLAB 模拟相同的详细信息(变量名称、类型和值/数据)。

          请注意,在 Python 解释器中,whos 列出了“交互式命名空间”中的所有变量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-01
            • 2015-09-03
            • 2022-10-19
            • 2018-05-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多