打印在一个Jupyter单元格中定义的所有变量

时间:2017-10-19 07:01:04

标签: python pandas ipython jupyter-notebook

是否有更简单的方法以漂亮的方式显示单个单元格中定义的所有变量的名称和值?

我现在的做法就是这样,但是当有30个或更多变量时,我浪费了很多时间:

enter image description here

3 个答案:

答案 0 :(得分:2)

您可以使用whos命令查看当前内核中存储的所有变量。

k, g, lx = .4, .8, 6.6
m = k*g*lx**2
whos

输出:

Variable   Type     Data/Info
-----------------------------
g          float    0.8
k          float    0.4
lx         float    6.6
m          float    13.939200000000001

但如上所述,它显示所有变量,因此它会显示您运行的早期单元格中的其他变量。

使用来自python内置函数的locals()globals()命令可以实现类似的结果,这些函数返回变量字典。但jupyter代表的方式更漂亮。

或者您可以使用InteractiveShell。这将改变单元格的行为并像python shell一样运行,因此一旦运行它将输出every called value(输出单元格)。

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

k
g
... do stuff ...
lx
m
... do more stuff ...

输出:

Out[2]: 0.4
Out[2]: 0.8
Out[2]: 6.6
Out[2]: 13.939200000000001

最后,您可以通过将交互性设置为last_expr来将其恢复为默认值。

InteractiveShell.ast_node_interactivity = "last_expr"

但是你这样做的方式可能是最简单和最漂亮的方式,你可以删除数据框上的任务以使其成为单行或者你可以通过以下方式使其更紧凑:

k, g, lx, m

Out[3]: (0.4, 0.8, 6.6, 13.939200000000001)

答案 1 :(得分:2)

您可以使用inspect库尝试这样的事情。

import inspect

k = 0.0417
g = 0.829
lx = 6.6
m = k*g*lx**2

def get_name(lst=[]):
    local_vars = inspect.currentframe().f_back.f_locals.items()
    for i in local_vars:
        lst.append(i)
    return dict(lst)

import pandas as pd

df = pd.DataFrame(get_name(), index=[0])
result = df.T.loc[df.dtypes != object]
print(result)
          0
g     0.829
k     0.0417
lx    6.6
m     1.50584

答案 2 :(得分:1)

因此,这是一个难以克服的难题。本质上,我们只是试图获取当前单元格中的所有行并提取变量。事实证明,我们无法使用Programmatically get current Ipython notebook cell output?中建议的由IPython定义的全局变量(例如import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.TextView; import java.util.ArrayList; public class CheckTestAdapter extends BaseAdapter { private Context mContext; private Context context; private final ArrayList<Model> listData; private LayoutInflater layoutInflater; private Model listModel; View rowView; ItemHolder holder; public CheckTestAdapter(Context context, ArrayList<Model> listData) { this.context = context; this.listData = listData; layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { ; return listData.size(); } @Override public Object getItem(int position) { return listData.get(position); } @Override public long getItemId(int position) { return listData.get(position).getId(); } @Override public View getView(int position, View view, ViewGroup parent) { rowView = view; holder = null; if (rowView == null) { rowView = layoutInflater.inflate(R.layout.check_items, null); } holder = new ItemHolder(); holder.moviesName = (TextView) rowView.findViewById(R.id.itemName); holder.checkTest = rowView.findViewById(R.id.itemChecked); holder.checkBox = (CheckBox) rowView.findViewById(R.id.chkItem); holder.itemID = rowView.findViewById(R.id.itemIdHolder); listModel = listData.get(position); final String test = String.valueOf(listModel.getId()); holder.itemID.setText(test); holder.moviesName.setText(listModel.getItemName()); holder.checkTest.setText(listModel.getCheckedItem()); holder.checkBox.setChecked(listModel.itemChecked()); // Tag is important to get position clicked checkbox holder.checkBox.setTag(position); holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { String checkVal = new String(); boolean chChecked = holder.checkBox.isChecked(); if (chChecked) { // Run update query checkVal = "Work"; } else if (!chChecked) { checkVal = "Stuff"; } holder.checkTest.setText(checkVal); } }); holder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int currentPos = (int) v.getTag(); boolean isChecked = false; if (listData.get(currentPos).itemChecked() == false) { isChecked = true; } listData.get(currentPos).setIsChecked(isChecked); notifyDataSetChanged(); } }); return rowView; } static class ItemHolder { TextView moviesName; TextView checkTest; CheckBox checkBox; TextView itemID; } } ___等),因为(就我的实验而言)已显示),您只能从以前执行的单元格中获取值,而不能从当前正在执行的单元格中获取值。

幸运的是,事实证明,使用魔术命令_i<n> 确实可以捕获当前单元格的输入。因此,在thisthis的帮助下,我创建了一个功能完全符合您想要的功能:

%history

您可以通过以下方式对其进行测试:

def cell_vars(offset=0):
    import io
    from contextlib import redirect_stdout

    ipy = get_ipython()
    out = io.StringIO()

    with redirect_stdout(out):
        ipy.magic("history {0}".format(ipy.execution_count - offset))

    #process each line...
    x = out.getvalue().replace(" ", "").split("\n")
    x = [a.split("=")[0] for a in x if "=" in a] #all of the variables in the cell
    g = globals()
    result = {k:g[k] for k in x if k in g}
    return result

应提供a = 1 b = 2 c = 3 cell_vars() ,然后您可以对其格式化并按需要打印。显然,我的行处理存在一些限制(假设所有感兴趣的变量都在全局范围内)。

希望这很有用!