小编Pas*_*ist的帖子

Python Logging模块:自定义记录器

我试图创建一个用于记录的自定义属性(调用者的类名,模块名称等),并遇到一个奇怪的异常,告诉我在进程中创建的LogRecord实例没有必要的属性.经过一些测试,我最终得到了这个:

import logging

class MyLogger(logging.getLoggerClass()):
    value = None

logging.setLoggerClass(MyLogger)

loggers = [
    logging.getLogger(),
    logging.getLogger(""),
    logging.getLogger("Name")
]

for logger in loggers:
    print(isinstance(logger, MyLogger), hasattr(logger, "value"))
Run Code Online (Sandbox Code Playgroud)

这段看似正确的代码产生:

False False
False False
True True
Run Code Online (Sandbox Code Playgroud)

错误或功能?

python logging

8
推荐指数
1
解决办法
4276
查看次数

Cython:在类型声明中使用导入的类

我正在写一个Cython 0.23程序,我无法弄清楚如何使用cdef class我从类型声明中的不同模块导入的程序.这是一个重现问题的片段.

test.py:

import pyximport
pyximport.install()

from mymodule import *

obj = MyClass(42)
print(obj.field)
print(identity(obj).field)
Run Code Online (Sandbox Code Playgroud)

这按预期工作并打印42两次:

mymodule.pyx:

cdef class MyClass:
    cdef readonly int field
    def __init__(self, field):
        self.field = field

cpdef MyClass identity(MyClass obj):
    return obj
Run Code Online (Sandbox Code Playgroud)

这会因编译器错误而失败:

mymodule.pyx:

from utils import MyClass

cpdef MyClass identity(MyClass obj):
    return obj
Run Code Online (Sandbox Code Playgroud)

utils.pyx:

cdef class MyClass:
    cdef readonly int field
    def __init__(self, field):
        self.field = field
Run Code Online (Sandbox Code Playgroud)

错误:

Error compiling Cython file:
------------------------------------------------------------
...
from utils …
Run Code Online (Sandbox Code Playgroud)

python cython

8
推荐指数
1
解决办法
1672
查看次数

将 Flask-SocketIO 与 Flask-Login 和 HTTP Basic Auth 结合使用

我正在尝试为内部监控实现一个非常简单的网页。它应该显示一些数据,这些数据通过 socketio 实时更新。服务器在后台运行一个线程,该线程获取数据并将其中继到客户端。

我想用登录表单保护页面。为了简单起见,我选择了 HTTP Basic Auth,主要是因为我不想设计登录表单。

我做了以下工作:

  • 在 下@login_manager.request_handler,我检查request.authorization. 如果它有效,我将返回一个经过身份验证的User对象。
  • 在 下@login_manager.unauthorized_handler,我触发了身份验证对话框。
  • '/'页面受保护@login_required
  • 我还拦截了该socketio.on('connect')事件并在current_user那里检查。如果未通过身份验证,我将断开连接。

这是整个工作示例:

## Standard imports, disregard them
import functools
import gevent

## Otherwise I'm getting KeyError on shutdown
import gevent.monkey
gevent.monkey.patch_all()

from flask import Flask, request, Response
from flask.ext.login import LoginManager, UserMixin, login_required, current_user
from flask.ext.socketio import SocketIO

## To see the logging.debug call in socketio.on('connect')
import logging
logging.getLogger().setLevel(logging.DEBUG)

## …
Run Code Online (Sandbox Code Playgroud)

python authentication flask flask-login flask-socketio

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

在Sympy中实现自定义数据类型

我想用二元运算(Tensor)执行计算,该运算带有两个非交换参数,将它们转换成类似对的东西,然后当我乘以这些对时做有趣的事情.

# a, b, c, d are non-commutative
Tensor(a, b) * Tensor(c, d) == Tensor(a*c, d*b)  # yes, in this order
Run Code Online (Sandbox Code Playgroud)

此外,我希望所有整数常量取模2.

-Tensor(a, b) == Tensor(a, b)
2*Tensor(a, b) == 0
Tensor(2*a, b) == 0
Run Code Online (Sandbox Code Playgroud)

我这样做了:

import sympy as sp
from sympy.core.expr import Expr

class Tensor(Expr):
    __slots__ = ['is_commutative']

    def __new__(cls, l, r):
        l = sp.sympify(l)
        r = sp.sympify(r)
        obj = Expr.__new__(cls, l, r)
        obj.is_commutative = False
        return obj

    def __neg__(self):
        return self

    def __mul__(self, other):
        if isinstance(other, …
Run Code Online (Sandbox Code Playgroud)

python math sympy

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

如果是模板化的话,g ++不会调用复制构造函数吗?

tl; dr:如果前面带有复制构造函数,则不会调用它template<typename Something>,并且Something在构造函数签名中使用它.


概念验证(ideone):

#include <cstdio>

template<typename T>
class Test {
private:
    T value_;

public:
    mutable bool has_copies;

    Test(const T& value) : value_(value), has_copies(false) {}

    template<typename Related> // remove template here to fix behavior
    Test(const Test<Related>& t) {
        printf("In copy constructor\n");
        value_ = t.value_;
        has_copies = true;
        t.has_copies = true;
    }
};

int main() {
    Test<int> t1(42);
    printf("Before constructor\n");
    Test<int> t2(t1);
    printf("After constructor:\n");
    printf("    t1 thinks it %s copies\n", t1.has_copies ? …
Run Code Online (Sandbox Code Playgroud)

c++ templates

3
推荐指数
1
解决办法
67
查看次数

Python:下标一个模块

我试图做这样的事情:

module.py

def __getitem__(item):
    return str(item) + 'Python'
Run Code Online (Sandbox Code Playgroud)

test.py

import module
print module['Monty']
Run Code Online (Sandbox Code Playgroud)

我希望打印出"MontyPython".但是,这不起作用:

TypeError: 'module' object is not subscriptable 
Run Code Online (Sandbox Code Playgroud)

是否可以在纯Python中创建一个可订阅模块(即不修改其源代码,猴子修补等)?

python module subscript

2
推荐指数
1
解决办法
1686
查看次数

Pythonic方式来处理导入错误

我在我的项目中使用自定义日志记录模块.如果它不可用,我想用假人代替它而不是提高ImportError.

这是当前执行此操作的代码:

try:
    import logger
except ImportError:
    print 'Couldn\'t load logger'

    class DummyLogger(object):
        def __init__(self):
            pass
        def log(self, image):
            pass

    logger = DummyLogger()
Run Code Online (Sandbox Code Playgroud)

我不认为这是一个优雅的解决方案.它确实有效,但它并不好.有没有更好的办法?

python import python-import

2
推荐指数
1
解决办法
63
查看次数

如何使用 Python 有效地分配预定义大小的文件并用非零值填充它?

我正在编写一个程序,该程序使用动态编程来解决一个难题。DP 解决方案需要存储一个大表。整个表占用大约 300 Gb。物理上它存储在 40 ~7Gb 文件中。我用 byte 标记未使用的表条目\xFF。我想快速为这张桌子分配空间。该程序必须同时在 Windows 和 Linux 下运行。

简而言之,我想以跨平台的方式有效地创建填充特定字节的大文件。

这是我目前使用的代码:

def reset_storage(self, path):
    fill = b'\xFF'

    with open(path, 'wb') as f:
        for _ in range(3715948544 * 2):
            f.write(fill)
Run Code Online (Sandbox Code Playgroud)

创建一个 7 Gb 文件大约需要 40 分钟。我如何加快速度?

我查看了其他问题,但似乎没有一个是相关的:

python linux windows file bigdata

2
推荐指数
1
解决办法
98
查看次数

使用Python在内存中分配大型数组

代码

import array, itertools
a = array.array('B', itertools.repeat(0, 3715948544))
Run Code Online (Sandbox Code Playgroud)

在我的机器上运行大约需要7分钟(6分44秒).该计算机具有8 Gb的RAM,并使用CPython 3.4.3运行Linux.如何更快地获得具有1字节unsigned int条目的类数组对象,最好使用Python标准库?Numpy可以立即分配(不到1毫秒).

python memory optimization

1
推荐指数
2
解决办法
1135
查看次数