小编max*_*max的帖子

timedelta方法的性能缓慢

为什么要.dt.days花费100倍的时间.dt.total_seconds()

df = pd.DataFrame({'a': pd.date_range('2011-01-01 00:00:00', periods=1000000, freq='1H')})
df.a = df.a - pd.to_datetime('2011-01-01 00:00:00')
df.a.dt.days # 12 sec
df.a.dt.total_seconds() # 0.14 sec
Run Code Online (Sandbox Code Playgroud)

python-3.x pandas

5
推荐指数
1
解决办法
420
查看次数

`Iterable [(int,int)]`tuple在类型提示中是不允许的

我有这个非常简单的代码:

from typing import List, Iterable

Position = (int, int)
IntegerMatrix = List[List[int]]

def locate_zeros(matrix: IntegerMatrix) -> Iterable[Position]:
    """Given an NxM matrix find the positions that contain a zero."""
    for row_num, row in enumerate(matrix):
        for col_num, element in enumerate(row):
            if element == 0:
                yield (col_num, row_num)
Run Code Online (Sandbox Code Playgroud)

这是错误:

Traceback (most recent call last):
  File "type_m.py", line 6, in <module>
    def locate_zeros(matrix: IntegerMatrix) -> Iterable[Position]:
  File "/usr/lib/python3.5/typing.py", line 970, in __getitem__
    (len(self.__parameters__), len(params)))
TypeError: Cannot change parameter count from 1 to 2 …
Run Code Online (Sandbox Code Playgroud)

python typing python-3.5

5
推荐指数
1
解决办法
445
查看次数

为什么耗尽的发电机不止一次提高StopIteration?

为什么当一个耗尽的发电机被多次调用StopIteration时,每次都会被调用,而不是仅仅是第一次尝试?后续调用是否毫无意义,并指出调用者代码中可能存在错误?

def gen_func():
    yield 1
    yield 2
gen = gen_func()
next(gen)
next(gen)
next(gen) # StopIteration as expected
next(gen) # why StopIteration and not something to warn me that I'm doing something wrong
Run Code Online (Sandbox Code Playgroud)

当有人意外使用过期的生成器时,这也会导致此行为:

def do_work(gen):
    for x in gen:
        # do stuff with x
        pass

    # here I forgot that I already used up gen
    # so the loop does nothing without raising any exception or warning
    for x in gen:
        # do stuff with x
        pass

def …
Run Code Online (Sandbox Code Playgroud)

python generator python-3.x

5
推荐指数
1
解决办法
793
查看次数

Mypy“类模块”注解

我有一个load_config加载并返回 python 模块的函数:

import imp

def load_config(path: str):
    return imp.load_source('config', path)

print(type(load_config('config.py')))
Run Code Online (Sandbox Code Playgroud)

此代码段打印<class 'module'>.

如何load_config使用 Mypy注释返回值?

python types mypy

5
推荐指数
1
解决办法
698
查看次数

如何在CPython中实现__subclasses__方法?

文档说:

每个类都保留一个对其直接子类的弱引用列表.此方法返回所有仍然存活的引用的列表.

但是,每个类如何首先获得其子类的弱引用列表?换句话说,当我创造

class B(A):
  pass
Run Code Online (Sandbox Code Playgroud)

怎么A发现它B只是继承了它?并且这种机制是否足够强大以存活边缘情况(自定义元类,分配__bases__等)?

python python-3.x python-internals

5
推荐指数
1
解决办法
220
查看次数

处理模块名称冲突

有时,应用程序与第三方软件包中的内部文件之间会发生模块名称冲突.例如,profile.py当前文件夹中命名的文件在jupyter notebook尝试导入而不是自己的文件时会导致崩溃profile.py.从包用户的角度来看,避免这个问题的好方法是什么?(或者这是包开发人员应该以某种方式阻止的东西?)

注意:虽然由于应用程序和内置名称(例如time.pysocket.py)之间的冲突而发生类似的问题,但至少记住标准库模块和其他内置对象的名称相对容易.

python python-import python-3.x

5
推荐指数
1
解决办法
399
查看次数

使用 from_object 加载烧瓶配置

文档flask.Config.from_object说:

您不应使用此功能加载实际配置,而应使用配置默认值。实际的配置应该使用 from_pyfile() 加载,并且最好从不在包内的位置加载,因为包可能安装在系统范围内。

为什么我不应该使用这个函数来加载实际配置?为什么要使用from_pyfile和从不在包内的位置加载实际配置?

请注意,Flask Web Development似乎用于from_object加载实际配置(第 78-79 页):

存储在定义的类之一中的配置设置config.py可以使用from_object()Flask 的app.config配置对象中可用的方法直接导入到应用程序中。

# code excerpt from the book:
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
Run Code Online (Sandbox Code Playgroud)

python flask

5
推荐指数
0
解决办法
205
查看次数

如何处理尚未准备好使用的`pickle.load`调用`__setitem__`?

我试图实现一个(原型,而不是生产)版本的持久字典,它使用磁盘上的 pickle 作为持久存储。然而,pickle.load调用是__setitem__为了它自己的目的,而且这是(当然)覆盖以确保对字典的更改传播回持久存储的方法——因此它调用pickle.dump. 当然,调用pickle.dump是不行的,因为每个项目都是在 unpickling 期间设置的。

除了蛮力(如下)之外,有没有办法解决这个问题?我尝试阅读Pickling Class Instances以寻找使用特殊方法的解决方案,但没有找到。

下面的代码监控 unpickling 是否正在进行,并pickle.dump在这种情况下跳过;虽然它工作正常,但感觉很糟糕。

import os, pickle

class PersistentDict(dict):
    def __new__(cls, *args, **kwargs):
        if not args: # when unpickling
            obj = dict.__new__(cls)
            obj.uninitialized = True
            return obj
        path, *args = args
        if os.path.exists(path):
            obj = pickle.load(open(path, 'rb'))
            del obj.uninitialized
            return obj
        else:
            obj = dict.__new__(cls, *args, **kwargs)
            obj.path = path
            obj.dump()
            return obj

    def __init__(self, *args, **kwargs):
        pass

    def __setitem__(self, …
Run Code Online (Sandbox Code Playgroud)

python pickle python-3.x

5
推荐指数
1
解决办法
602
查看次数

让我们在GHCi中进行常规任务

两者之间有什么区别吗?

f x = x + 1
Run Code Online (Sandbox Code Playgroud)

let f x = x + 1
Run Code Online (Sandbox Code Playgroud)

什么时候输入GHCi?IIUC,有一条特殊的规则,即let没有in内部GHCi有效地适用于整个翻译范围.但如果存在let没有区别,这条规则的重点是什么?

编辑:使用GHCi 8.0.2版.

haskell

5
推荐指数
1
解决办法
851
查看次数

Python 3.1:C3方法解析顺序

一个非常简单的钻石型继承案例:

class Root:
    def f(self):
        print('Root')

class A(Root): pass

class B(Root):
    def f(self):
        print('B')

class AB(A, B): pass

AB().f()
Run Code Online (Sandbox Code Playgroud)

根据Python 3.1.2文档:

在大多数情况下,在最简单的情况下,您可以将从父类继承的属性的搜索视为深度优先,从左到右,而不是在层次结构中存在重叠的同一类中搜索两次.

因此,我希望我的例子按顺序解决:AB - > A - > Root - > B.但事实并非如此.使用ActiveState Python 3.1.2,输出为'B'而不是'Root'.

我错过了什么?

另外,我注意到ActiveState Python 2.6使用相同的代码打印"Root".决议规则是否在2.6和3.1之间变化?

multiple-inheritance python-3.x

4
推荐指数
1
解决办法
2023
查看次数