我正在构建一个Python类,该类可用于PySpark数据帧或配置单元表.输入数据可以是table\u name的strDataFrame.Python的最佳实践是什么?我想这样做,以便它根据用例灵活.唯一的区别在于数据应该如何传递给类(作为表或Spark数据帧),其他一切都是一样的.

参见以下示例:

class DataPipeline:

    def __init__(self, data):
        if isinstance(data, str):
            self.df = spark.read.table(data)
        elif isinstance(data, DataFrame):
            self.df = data
        else:
            raise ValueError("some error")

    def process_data(self):
       # do something with the self.df here

推荐答案

不要.让__init__期望DataFrame,并让调用方负责(可能通过类方法)将字符串转换为DataFrame before DataPipeline.__init__被调用.

class DataPipeline:

    def __init__(self, data: DataFrame):
        self.df = df


    @classmethod
    def from_string(cls, data: str):
        return cls(spark.read.table(data))


p1 = DataPipeline(some_data_frame)
p2 = DataPipeline.from_string("...")  # DataPipline(spark.read.table("..."))

Ryan Singer(据推测,尽管经常被引用,但我还没有找到原始来源)曾经说过

软件的复杂性来自于试图让一件事做两件事.

这里,您试图将一件事(DataPipeline.__init__)转换为两件事(使用字符串初始化DataPipeline,使用DataFrame初始化DataPipeline).

对于重构,我 Select 了__init__的最简单情况(接受DataFrame),将更复杂的逻辑(首先将字符串解析为DataFrame)移动到单独的类方法中,该类方法使用适当的数据帧调用__init__.


(您是希望对类型验证进行任何显式运行时判断以使其提前失败,还是仅仅假设调用方将接受未能传递正确类型的值的后果,这取决于您自己.)

Python相关问答推荐

通过在测验程序中添加解释来加强学习

一切似乎都可以自己工作,但当我把它放在一起时,它会抛出RegexMatch错误

在pandas DataFrame上运行apply()时如何访问DateTime索引?

X射线扫描显示Docker中的pip漏洞,尽管图像中未安装pip

在Windows上启动新Python项目的正确步骤顺序

在matplotlib动画gif中更改配色方案

多处理代码在while循环中不工作

我在使用fill_between()将最大和最小带应用到我的图表中时遇到问题

@Property方法上的inspect.getmembers出现意外行为,引发异常

. str.替换pandas.series的方法未按预期工作

使可滚动框架在tkinter环境中看起来自然

无法通过python-jira访问jira工作日志(log)中的 comments

avxspan与pandas period_range

组/群集按字符串中的子字符串或子字符串中的字符串轮询数据框

为什么抓取的HTML与浏览器判断的元素不同?

如何设置视频语言时上传到YouTube与Python API客户端

使用NeuralProphet绘制置信区间时出错

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

基于形状而非距离的两个numpy数组相似性