pyspark/sql/types.py中的Spark Row类不包含__init__ 方法,但显示__new__的以下重载类型提示:

@overload
def __new__(cls, *args: str) -> "Row"

@overload
def __new__(cls, **kwargs: Any) -> "Row"

def __new__(cls, *args: Optional[str], **kwargs: Optional[Any]) -> "Row"

Row的文档字符串显示了各种实例化:

>>> Person = Row("name", "age")
>>> row1 = Row("Alice", 11) # This is the one that is hard to understand
>>> row2 = Row(name="Alice", age=11)
>>> row1 == row2
True

上面的second行不适合任何超载的原型. 它almost与原型匹配*args,除了所有 在支持*args的论点中,应该有strings个.这是 显然不是Row("Alice",11)的情况,而是那个调用 在REPL提示符下发出时,不会生成任何消息. 显然,我遗漏了一些关于 类型提示和重载工作.有没有人能解释一下?

P.S.对于上下文, 我通过try 了解构造函数是如何实现的 知道Row("name","age")指定字段名称,而 Row("Alice", 11)指定字段值.的源代码 __new__表示这取决于参数列表是否为 *args**kwargs.中的Row个方法调用 本段使用*args,但 第二个根本不适合上面*args的原型.

推荐答案

Rowtuple的子类,因此它的行为相应.查看源代码,我可以推断出这里使用的类型提示不执行任何运行时判断来强制执行类型,因此本质上可以使用任何对象类型创建Row对象,而不仅仅是int和字符串.这里有一个例子,

class Foo:
    pass

class Bar:
    pass


>>> Row(Foo(), Bar())
# <Row(<__main__.Foo object at 0x7f5bb3ef4700>, <__main__.Bar object at 0x7f5bb36458d0>)>

仅使用args创建行对象不会自动设置__fields__参数.因此,您的假设"对于上下文,我是通过try 了解构造函数如何知道Row("name","age")指定字段名而Row("Alice", 11)指定字段值"的假设是不正确的.

相反,默认情况下,两者都将设置元组的值.这就是在您的示例中使用row1 == row2的原因

>>> row = Row('name', 'age')
>>> row.__fields__
# AttributeError: __fields__

>>> row1 = Row("Alice", 11)
>>> row2 = Row(name="Alice", age=11)
>>> row1 == row2
# True

这里重要的一点是,Row还定义了__call__方法,该方法将从字段和值创建一个新的Row实例.基本上,当您以这种方式调用现有的Row对象时,现有的值将成为新的赋值字段

>>> row = Row('name', 'age')('Alice', 11)
>>> row
# Row(name='Alice', age=11)

>>> row.__fields__
>>> <Row('name', 'age')>

但当您使用kwargsForm时,会自动设置字段和值,

>>> row = Row(name="Alice", age=11)
>>> row
# Row(name='Alice', age=11)

>>> row.__fields__
# ['name', 'age']

Python相关问答推荐

try 使用tensorFlow.keras.models时optree Import错误

使用decorator 重复超载

Python中的锁定类和线程以实现dict移动

Python:MultiIndex Dataframe到类似json的字典列表

每个组每第n行就有Pandas

如何处理必须存在于环境中但无法安装的Python项目依赖项?

如何使用Tkinter创建两个高度相同的框架(顶部和底部)?

Python panda拆分列保持连续多行

在Pandas 日历中插入一行

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

按顺序合并2个词典列表

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

使用密钥字典重新配置嵌套字典密钥名

计算每个IP的平均值

实现神经网络代码时的TypeError

如何使用SentenceTransformers创建矢量嵌入?

dask无groupby(ddf. agg([min,max])?''''

在Python中从嵌套的for循环中获取插值

Pandas—MultiIndex Resample—我不想丢失其他索引的信息´