在Jupyter Notebook中显示未显示在if-else块内的HTML类



我使用这个类来表示.ipynb文件中的数据帧:

# Handy class for DataFrame viz
class display(object):
'''
Display HTML representation of multiple objects
'''

template = '''<div style="float: left; padding: 10px;">
<p style='font-family:"Courier New", Courier, monospace'>{0}</p>{1}
</div>'''

def __init__(self, *args):
self.args = args

def _repr_html_(self):
return 'n'.join(self.template.format(a, eval(a)._repr_html_()) for a in self.args)

def __repr__(self):
return 'nn'.join(a + 'n' + repr(eval(a)) for a in self.args)

这个类不在if-else块中工作,我不明白为什么。

有人能解释一下吗?提前Thx!


Chunk复制问题:

import pandas as pd
# Handy class for DataFrame viz
# Create a sample DataFrame with 3 rows and 5 columns
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9],
'D': [10, 11, 12],
'E': [13, 14, 15]
})
# Display the DataFrame
display('df')
>>>
df
A   B   C   D   E
0   1   4   7   10  13
1   2   5   8   11  14
2   3   6   9   12  15
inside = True
if inside:
display('df')
>>>

我认为这可能是因为if insideif-else的缩进使其不在单元格最后一行的最外点上,所以IPython/Jupyter不使用InteractiveShell来"显示"它,使用它对单元格中最后一个未缩进对象的特殊处理,请参阅此处last_exprInteractiveShell.ast_node_interactivity的默认值。以同样的方式。。。假设你在一个单元格中运行以下内容:

a = 4
a

这将显示4Out

但如果你在下一个单元格中执行以下操作,它不会显示4:

inside = True
if inside:
a

IPython/Jupyter应用于最后一行项目的花式显示处理没有得到应用,因为它不是该行评估的最外层项目,因此不会传递给IPython的花式表示处理。(或者至少我是这么想的。请参阅Thomas K在这里的解释,当表达式处于for循环中,因此缩进类似于if-else时,它如何只在单元格末尾显示裸露的表达式。)我认为这可能反映了你在做什么?

但这是有效的:

from IPython.display import display
inside = True
if inside:
display(a)

你可以这样做来强制应用它的奇特处理,如果你只是把a放在一个单元格中并运行它的话

或者,如果您首先调整`InteractiveShell.ast_node_interactive的设置,您可以使用以下内容:

inside = True
if inside:
a

在单独的单元格中尝试之前,您可以运行以下操作之一:

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

-或-

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

(因为在运行您希望新设置生效的单元格之前,需要运行并应用,所以您不能在要运行if inside:的同一单元格中添加代码来调整InteractiveShell.ast_node_interactivity。)

选项A:调整InteractiveShell.ast_node_interactivity以尝试修复您正在做的事情

因此,为了使您的原始示例代码发挥作用,您可以选择在原始帖子中运行inside = True代码块之前,先将以下内容作为单元格本身运行:

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

可选选项B:如果使用IPython的显示器来尝试修复您正在做的事情:

因此,为了使您的数据帧显示类版本正常工作,我们不要遮蔽IPython的display,因为我们需要它。所以把它做成一个细胞:

class spec_display(object):
'''
Display HTML representation of multiple objects
'''

template = '''<div style="float: left; padding: 10px;">
<p style='font-family:"Courier New", Courier, monospace'>{0}</p>{1}
</div>'''

def __init__(self, *args):
self.args = args

def _repr_html_(self):
return 'n'.join(self.template.format(a, eval(a)._repr_html_()) for a in self.args)

def __repr__(self):
return 'nn'.join(a + 'n' + repr(eval(a)) for a in self.args)

然后作为一个单独的细胞,这就像你原来的一样:

import pandas as pd
# Handy class for DataFrame viz
# Create a sample DataFrame with 3 rows and 5 columns
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9],
'D': [10, 11, 12],
'E': [13, 14, 15]
})
# Display the DataFrame
spec_display('df')

除了现在在另一个单元格中,您看到的不起作用可以通过显式调用IPython的display来实现,就像我们可以使用它在一个单元格打印多个数据帧并添加标题一样(我会回到这里):

from IPython.display import display
inside = True
if inside:
display(spec_display('df'))

最后,我在上面提到,您可以使用IPython的display在一个单元格中打印代码中的多个数据帧,并在一个输出单元格中添加标题。(我之所以提出这个问题,是因为我在代码的注释中看到了"显示多个对象的HTML表示"。)例如:

import pandas as pd
df1 = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9],
'D': [10, 11, 12],
'E': [13, 14, 15]
})
df2 = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9],
'D': [10, 11, 12],
'E': [13, 14, 15]
})
from IPython.display import display, HTML
display(HTML('<b>Dataframe One:</b>'))
display(df1)
display(HTML('<b>Dataframe Two:</b>'))
display(df2)

我们可以告诉IPython如何处理事情,而不依赖于它通常只应用于最后一行中未受影响的最终对象的特殊处理。

相关内容

  • 没有找到相关文章

最新更新