我想我所有的dataframes,无论他们是从构造函数重载的任何一个建立起来的,无论他们是来自衍生.read_csv(),.read_xlsx(),.read_sql(),或任何其他方法,使用新的可为空的Int64数据类型为默认dtype将所有整数,而不是int64。
如果没有一种“不错”的方法,我愿意在任何程度上做到疯狂,包括子类化DataFrame或Series类,以及重新实现任意数量的方法和构造函数属性等。
我的问题是,可以做到吗?如果是这样,我将如何处理?
所以,让我们假设我有一个包含 20 个逻辑分离模块的库代码的 python 包,我想从每个模块中选择 1 或 2 个类作为包的公共 api。与其强迫用户直接从模块中导入这些类,我想让它们直接从包的命名空间中使用,在__init__.py.
但是我不希望每次都急切地加载所有内容,因为每当有人试图从单个类访问一个类时加载所有 20 个模块是一种巨大的浪费(其中一些包含自己昂贵的导入),所以我实现了一个__getattr__()根据https://www.python.org/dev/peps/pep-0562/ 进行模块级别,并在有人尝试导入该类时使用其中的 importlib 加载给定类的模块。
这是一个相对干净的解决方案,但让它成为噩梦的部分是这绝对杀死了 Jedi 或 PyCharm 等静态代码分析工具。自动完成和光标悬停文档字符串对我来说意义重大,因为它们极大地提高了生产力,所以我不想编写 IDE 无法理解的库代码。
我可以编写打字存根,但这会增加更多的维护负担,因为实际上我已经对所有代码进行了类型注释并带有内联文档字符串。这不是一个很好的解决方案。
有谁知道我还能怎么做?我希望有一些聪明的方法来解决这个问题,我只是没有想过。
所以这是一个相当小的问题,但我想知道是否有更熟悉打字模块的人可能知道是否有办法做到这一点。
我希望能够定义一个类型变量,该变量始终等同于它在内部使用的类的实例(如果由子类使用,则等同于该子类类型的实例)。
我目前正在做的是确保 mypy 了解返回值等同于它被调用的类是注释“self”和“cls”参数,如下所示:
from typing import TypeVar, Type
T = TypeVar("T")
class Parent:
@classmethod
def from_classmethod(cls: Type[T]) -> T:
return cls()
def from_method(self: T) -> T:
return type(self)()
class Child(Parent):
pass
Child.from_classmethod() # mypy: Revealed type is Child
Child().from_method() # mypy: Revealed type is Child
Run Code Online (Sandbox Code Playgroud)
它确实有效,mypy 会将这些正确解释为类 Child,而不是 Parent。
但是,如果没有必要,我不想这样做。我想知道是否有某种方法可以创建一个像这样工作的 TypeVar:
SelfType = ... # some voodoo magic goes here
class Parent:
@classmethod
def from_classmethod(cls) -> SelfType:
return cls()
def from_method(self) -> SelfType:
return type(self)()
class Child(Parent):
pass …Run Code Online (Sandbox Code Playgroud) 我一直在浏览 SQLAlchemy api,它非常复杂,所以我想我会在这里问,看看是否有人可以以某种易于理解的格式向我解释这一点。
我正在围绕 O365 python api 编写一个包装器,用于使用类似于 SQLAlchemy 的语法编写 Office365 REST api 查询。
O365 提供了一个流畅的查询类,如下所示:
Message.new_query().on_attribute("subject").contains("Hello Friend!").chain("and").on_attribute("from").equals("some_address@gmail.com")
Run Code Online (Sandbox Code Playgroud)
我目前有一些可以工作的东西,看起来像这样:
Message.where(Subject.contains("Hello Friend!") & (From == "some_address@gmail.com")).execute()
Run Code Online (Sandbox Code Playgroud)
确切的代码并不是真正相关,但简单地说,它通过为运算符实现魔术方法并添加额外的方法(例如 .contains())来构建 BooleanExpression 对象。例如:
From == "some_address@gmail.com"
Run Code Online (Sandbox Code Playgroud)
将返回一个布尔表达式。
BooleanExpression 对象然后与“&”或“|”组合 返回 BooleanExpressionClause 对象的运算符,这些对象基本上是一个 BooleanExpression 对象列表,用于跟踪每 2 个表达式由哪个运算符连接。
最后, .where() 方法使用单个 BooleanExpressionClause 并在后台为其构建流畅的查询。
到现在为止还挺好。
所以我遇到的障碍涉及优先分组。
假设我想要所有带有“嗨!”的消息 在他们的主题中由地址中有“john”或地址中有“doe”的发件人。如果我有这样的查询:
From.contains("john") | From.contains("doe") & Subject.contains("Hi!")
Run Code Online (Sandbox Code Playgroud)
我会收到地址中带有“john”的任何人的每条消息,因为 Microsoft 的 API 实际上将生成的 REST 请求读取为:
From.contains("john") | (From.contains("doe") & Subject.contains("Hi!"))
Run Code Online (Sandbox Code Playgroud)
当我想要的是:
(From.contains("john") | From.contains("doe")) & Subject.contains("Hi!")
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是使用我当前的 API 编写它,那么它与完全不使用任何括号编写它没有什么不同,因为据我所知,对于 python,第一个示例(没有优先级组),以及第三个例子(我想要的优先级组)看起来完全一样,因为解释器只是从左到右读取这样的子句。
这终于让我想到了我的问题。SQLAlchemy 能够以某种方式理解优先组,但我一生都无法理解它是如何做到的。 …
据我所知,Clink ( http://mridgers.github.io/clink/ ) 没有提供任何有关如何使用它提到的 lua API 的文档。
我查看了安装目录中 clink.lua 文件的内容,我可以看到它是如何工作的,但我想知道如何编写自己的 lua 文件来添加新的参数自动完成(我不想要直接编辑 clink.lua 以避免破坏现有功能的风险)并让 Clink 检测并使用我的文件。
过去有人玩过这个吗?
python ×4
python-3.x ×3
autocomplete ×1
lazy-loading ×1
lua ×1
mypy ×1
numpy ×1
pandas ×1
sqlalchemy ×1
types ×1