Ответ 1
Это существует. Это просто не определено явно. Функции, экспортируемые из pyspark.sql.functions
, представляют собой тонкие обертки вокруг кода JVM и, за некоторыми исключениями, требующими специальной обработки, генерируются автоматически с использованием вспомогательных методов.
Если вы внимательно проверьте источник , вы найдете col
в списке среди других _functions
. Этот словарь дополнительно повторяется, а _create_function
используется для создания оболочек. Каждая сгенерированная функция напрямую назначается соответствующему имени в globals
.
Наконец, __all__
, который определяет список элементов, экспортируемых из модуля, просто экспортирует все globals
, кроме тех, которые содержатся в черном списке.
Если этот механизм все еще не ясен, вы можете создать игрушечный пример:
Создайте модуль Python
foo.py
со следующим содержимым:# Creates a function assigned to the name foo globals()["foo"] = lambda x: "foo {0}".format(x) # Exports all entries from globals which start with foo __all__ = [x for x in globals() if x.startswith("foo")]
Поместите его где-нибудь в путь Python (например, в рабочий каталог).
Импорт
foo
:from foo import foo foo(1)
Нежелательный побочный эффект такого метапрограммирующего подхода заключается в том, что определенные функции могут не распознаваться инструментами, в зависимости только от статического анализа кода. Это не критичная проблема, и ее можно безопасно игнорировать в процессе разработки.
В зависимости от IDE установка аннотаций типа может решить проблему (см., Например, zero323/pyspark-stubs # 172).