gpt4 book ai didi

python - 在 Python 模块中隐藏中间计算

转载 作者:太空宇宙 更新时间:2023-11-03 13:29:33 27 4
gpt4 key购买 nike

我在 Jupyter 笔记本中有一个 Python 文件 src/data.py,它用于读取数据文件并提供一些输出。

import numpy as np
import pandas as pd

sha256_perf = (
pd.read_csv('data/hashbench-output.txt', sep='\t', na_filter=False)
.query('Algorithm == "SHA256"')
)

mean_throughput = sha256_perf['Throughput (MiB/s)'].mean()
variance = sha256_perf['Error (± MiB/s)'] ** 2
total_variance = variance.sum()
row_count = sha256_perf.shape[0]
variance_of_mean = total_variance / (row_count ** 2)
error_of_mean = variance_of_mean ** 0.5

sha256_summary = pd.DataFrame(data=[[mean_throughput, error_of_mean]])
sha256_summary.columns = ['Mean Throughput (MiB/s)', 'Error (± MiB/s)']

其中,我唯一关心的变量是输出表 -- sha256_perfsha256_summary。然而,Python 无法知道这一点,所以如果我 dir() 模块,我会得到所有东西:

>>> import src.data as data
>>> dir(data)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__',
'__name__', '__package__', '__spec__', 'assumptions', 'error_of_mean',
'mean_throughput', 'np', 'pd', 'prd_scratch_2018', 'row_count', 'sha256_perf',
'sha256_summary', 'total_variance', 'util', 'variance', 'variance_of_mean']

如果这是 Ruby 或 Scala,我可以在 block 中初始化 sha256_summary,例如:

sha256_summary = begin
mean_throughput = sha256_perf['Throughput (MiB/s)'].mean()
# ... etc. ...
df.columns = ['Mean Throughput (MiB/s)', 'Error (± MiB/s)']
df
end

即使在 Java (8+) 中,我也可以通过 Supplier 和 lambda 破解一些东西。

但据我所知,Python 没有匿名 block 或多行 lambda。到目前为止,我能想到的最好办法就是将所有内容都放在一个函数中:

def create_summary():
mean_throughput = sha256_perf['Throughput (MiB/s)'].mean()
# ... etc. ...
sha256_summary.columns = ['Mean Throughput (MiB/s)', 'Error (± MiB/s)']
return sha256_summary

sha256_summary = create_summary()

但这仍然会导出 create_summary 符号,我宁愿避免这种情况:

>>> dir(data)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__',
'__name__', '__package__', '__spec__', 'assumptions', 'create_summary',
'np', 'pd', 'prd_scratch_2018', 'sha256_perf', 'sha256_summary', 'util']

避免污染全局命名空间的 Pythonic 方法是什么?

最佳答案

Right leg's answer很好,但我想指出在模块中定义“有意义的”名称的其他方法,而不是事后删除内容。

第一个选项是在你的模块中定义__all____all__ 是作为模块接口(interface)一部分的字符串序列;如果您的模块的用户执行 from modulename import *,并且定义了 __all__,他们只会在 __all__ 中提取名称。所以在你的情况下,你只需添加:

__all__ = ['sha256_perf', 'sha256_summary']

靠近模块的顶部(位置无关紧要,但按照惯例它放在顶部附近,通常就在导入之后)。许多内省(introspection)工具也使用此信息来限制模块的哪些部分包含在输出中(例如 help(modulename) 在带有 __all__ 的模块上排除类和函数不包含在 __all__ 中)。

或者,您可以避免__all__,只需确保模块的所有非公共(public)部分都以下划线开头;当未定义 __all__ 时,“虚拟”__all__ 行为是包含不带前导下划线的名称,并省略带前导下划线的名称。因此,如果除了您关心的两个名称之外的所有名称都带有下划线前缀(包括导入的模块名称,例如 import numpy as _npimport pandas as _pd),那么它们将是当使用 from modulename import * 时省略,通常从 help() 输出等中省略。

不,它不会更改 dir 看到的名称集(尽管制表符完成工具会经常省略以下划线开头的名称),但它是声明名称的官方方式被视为您的公共(public) API 的一部分。

关于python - 在 Python 模块中隐藏中间计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49459373/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com