小编Mat*_*und的帖子

是否有任何Python等效于部分类?

使用"新"样式类(我在python 3.2中)有没有办法将类分割为多个文件?我有一个很大的类(从面向对象的设计角度来看,它应该是一个单独的类,考虑耦合等,但是为了便于编辑类,分割几个文件会很好.

python partial-classes

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

Python的time.sleep(0)在linux下的行为 - 是否会导致上下文切换?

这种模式出现了很多,但我找不到直接的答案.

一个非关键的,不友好的计划可能会这样做

while(True):
    # do some work
Run Code Online (Sandbox Code Playgroud)

使用其他技术和平台,如果你想让这个程序运行得很热(尽可能多地使用CPU周期)但是要礼貌 - 允许其他热门运行的程序有效地减慢我的速度,你经常会写:

while(True):
    #do some work
    time.sleep(0)
Run Code Online (Sandbox Code Playgroud)

我已经阅读了有关后一种方法是否会在python上运行的相互矛盾的信息,在Linux机器上运行.它是否导致上下文切换,导致我上面提到的行为?

编辑:为了什么值得,我们在Apple OSX中尝试了一个小实验(没有方便的linux盒子).这个盒子有4个核心加上超线程,所以我们只用a来编写8个程序

while(True):
    i += 1
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,活动监视器将8个进程中的每个进程显示为消耗超过95%的CPU(显然有4个内核和超线程,总共获得800%).然后,我们制定了第九个这样的计划.现在所有9人都跑了85%左右.现在杀死第九个人,并启动一个程序

while(True):
    i += 1
    time.sleep(0)
Run Code Online (Sandbox Code Playgroud)

我希望这个过程使用接近0%,其他8个将运行95%.但相反,所有九个人都跑了85%左右.所以在Apple OSX上,sleep(0)似乎没有任何效果.

python multithreading

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

为要排序的类实现__lt__是否安全?

假设我的ClassA实例最终会出现在数据结构中,我们知道将在其上调用sorted().这是别人的代码,它会调用sorted(),所以我不能指定一个排序函数,但我可以实现适合ClassA的任何方法.

在我看来

def __lt__(self, other):
Run Code Online (Sandbox Code Playgroud)

是足够的,我不需要实现其他五个左右的方法(qt,eq,le,ge,ne).

这够了吗?

python sorting

29
推荐指数
1
解决办法
6509
查看次数

Python日志记录 - DEBUG下面有什么东西吗?

在其他一些技术中,我们偶尔使用DEBUG以下的日志级别,我认为这个级别被称为"详细".我意识到对这种水平的需求是非常主观的.但在我看来,"只是"拥有INFO和DEBUG还不够.我们有时需要记录一些非常垃圾邮件(比调试更垃圾邮件).在实践中,我们会在没有打开的情况下生成构建版本,但在少数情况下,我们会在产品全部安装到某些QA设置后启用此级别的日志记录,同时跟踪错误等.

有没有办法(简单或其他方式)使用标准的python日志库记录DEBUG级别以下的东西?

在temp.py文件中,我可以执行以下操作:

logging.addLevelName(5,"verbose")
VERBOSE = 5

logger = logging.getLogger("foo")
logger.setLevel(VERBOSE)
logger.log(VERBOSE,"blah!")
Run Code Online (Sandbox Code Playgroud)

这在我在IDE中运行temp.py(并记录到stdout)时有效,但我们的真实守护进程使用标准文件/字典配置语法来设置日志记录,我没有看到任何方式表明应该使用级别5守护进程.

我在追逐一些不太可行的东西吗?

对于那些可能想知道我为什么需要低于DEBUG的东西的人来说,偶尔会出现一种非常频繁的日志记录(也许是一个内循环),即使在DEBUG,我也不会想看到它,但在某些生产系统上在一段时间内启用它可能会有所帮助,而无需在源代码中添加更多日志记录并重新部署等.

EDIT1 - 显然,日志库允许自定义级别.由于DEBUG是10级,所以在1..9范围内的某个地方有空间.如果我定义一个自定义级别(例如上面的示例代码中),我想我真正的问题是如何从json日志配置文件中启用该级别的日志记录?

EDIT2 - 如果不是因为我们需要/使用json配置文件(我无法更改的要求),以下内容将起作用:

import logging

logging.basicConfig(filename='example.log',level=5)
VERBOSE = 5
logging.addLevelName(5,"verbose")
logger = logging.getLogger("bar")
logger.log(VERBOSE,"blah!")
Run Code Online (Sandbox Code Playgroud)

EDIT3 - 弄清楚了......打电话给

logging.addLevelName(5,"VERBOSE")
Run Code Online (Sandbox Code Playgroud)

至关重要.我只是没有把它放在正确的地方.在我的情况下,我只需要在调用日志库dictConfig(...)调用之前进行上述调用.在我这样做之后,我就可以进入我们的日志配置文件并将事情(在文件处理程序和根目录上)降低到VERBOSE并且它有效.

当然,日志语句本身并不完美,因为您调用:

self.logger.log(VERBOSE,"Something very spammy")
Run Code Online (Sandbox Code Playgroud)

而不是

self.logger.verbose("Something very spammy")
Run Code Online (Sandbox Code Playgroud)

但我真的不想修改任何记录器库代码(去过那里,完成了,有T恤).

谢谢大家!

对于那些认为不需要低于DEBUG的人来说,更多的力量给你:)

python logging

17
推荐指数
3
解决办法
7659
查看次数

创建一个实例,我已经有了这个类型

class ClassA: pass
mytype = type(ClassA)
Run Code Online (Sandbox Code Playgroud)

使用mytype,如何创建ClassA实例?

请注意,我不是在寻找这个作为我的答案:)

instance = ClassA()
Run Code Online (Sandbox Code Playgroud)

我知道在这个例子中,这就是你需要做的所有事情,但是假设你有这种类型(mytype),你对它一无所知,你需要创建它的一个实例.

我试着调用mytype()并返回一个错误,指出type()需要1或3个参数.我想这些参数可能与你想要传递给正在创建的对象的init方法的任何参数有关.

注意:我已经看到了一些问题,询问如何在给定表示其完全限定名称的字符串的情况下创建对象.请注意,在这里,我已经有一个类型,所以它有点不同?我认为?

编辑...我曾希望我可以做相同的以下.Net代码:

class A {}

class Program
{
    static void Main(string[] args)
    {
        Type type = typeof(A);

        // Given the type, I can create a new instance
        object new_instance = Activator.CreateInstance(type);
    }
}
Run Code Online (Sandbox Code Playgroud)

我假设在Python中,类型(ClassA)提供了一些东西,我以后可以使用它来创建ClassA的实例.看起来我误解了python中的类型.

python

13
推荐指数
1
解决办法
9840
查看次数

有没有办法访问包含基类的__dict__(或类似的东西)?

假设我们有以下类层次结构:

class ClassA:

    @property
    def foo(self): return "hello"

class ClassB(ClassA):

    @property
    def bar(self): return "world"
Run Code Online (Sandbox Code Playgroud)

如果我像这样在ClassB上探索__ dict __,我只看到bar属性:

for name,_ in ClassB.__dict__.items():

    if name.startswith("__"):
        continue

    print(name)
Run Code Online (Sandbox Code Playgroud)

输出是吧

我可以使用自己的方法来获取不仅指定类型而且还包含其祖先的属性.但是,我的问题是,在没有重新发明轮子的情况下,我是否已经在python中实现了这一目标.

def return_attributes_including_inherited(type):
    results = []
    return_attributes_including_inherited_helper(type,results)
    return results

def return_attributes_including_inherited_helper(type,attributes):

    for name,attribute_as_object in type.__dict__.items():

        if name.startswith("__"):
            continue

        attributes.append(name)

    for base_type in type.__bases__:
        return_attributes_including_inherited_helper(base_type,attributes)
Run Code Online (Sandbox Code Playgroud)

运行我的代码如下......

for attribute_name in return_attributes_including_inherited(ClassB):
    print(attribute_name)
Run Code Online (Sandbox Code Playgroud)

...回馈bar和foo.

请注意,我正在简化一些事情:名称冲突,使用items(),对于此示例,我可以使用dict,跳过以__开头的任何内容,忽略两个祖先本身具有共同祖先的可能性等.

EDIT1 - 我试图让这个例子变得简单.但我真的想要每个类和祖先类的属性名称和属性引用.下面的答案之一让我有了一个更好的轨道,当我开始工作时,我会发布一些更好的代码.

EDIT2 - 这就是我想要的,而且非常简洁.它基于以下Eli的答案.

def get_attributes(type):

    attributes = set(type.__dict__.items())

    for type in type.__mro__:
        attributes.update(type.__dict__.items())

    return attributes
Run Code Online (Sandbox Code Playgroud)

它返回属性名称及其引用. …

python attributes

13
推荐指数
2
解决办法
3850
查看次数

在一个python文件上运行Sphinx的最简单方法

我们有一个Sphinx配置,它将为我们的整个代码库生成大量HTML文档.有时,我正在处理一个文件,我只想看到该文件的HTML输出,以确保我在不运行整个套件的情况下获得了正确的语法.

我找了一个最简单的命令,我可以在终端上运行这个文件运行sphinx,我确信信息在那里,但我没有看到它.

python python-sphinx

12
推荐指数
1
解决办法
5883
查看次数

从静态方法记录

在几乎没有静态函数的类中,我通常会像这样进行日志记录:

class ClassA:

    def __init__(self):
        self._logger = logging.getLogger(self.__class__.__name__)

    def do_something(self):
        self._logger.info("Doing something")

    def do_something_else(self):
        self._logger.info("Doing something else.")
Run Code Online (Sandbox Code Playgroud)

在使用静态方法的类中,我一直这样做:

class ClassB:

    _logger = logging.getLogger("ClassB")

    @staticmethod
    def do_something():
        ClassB._logger.info("Doing something")

    @staticmethod
    def do_something_else():
        ClassB._logger.info("Doing something else")
Run Code Online (Sandbox Code Playgroud)

你可以这样做,但似乎很蹩脚:

class ClassB:

    @staticmethod
    def do_something():
        logger = logging.getLogger("ClassB")
        logger.info("Doing something")

    @staticmethod
    def do_something_else():
        logger = logging.getLogger("ClassB")
        logger.info("Doing something else")
Run Code Online (Sandbox Code Playgroud)

从静态方法记录是否有更好的模式?

python logging

10
推荐指数
1
解决办法
3831
查看次数

Python中的位掩码

我有一个字节(来自其他供应商),潜在的位掩码如下:

value1 = 0x01 value2 = 0x02 value3 = 0x03 value4 = 0x04 value5 = 0x05 value6 = 0x06 value7 = 0x40 value8 = 0x80

我可以指望value1到value6中的一个存在.然后可以设置或不设置value7.value8可能已设置,也可能未设置.

所以这是合法的:value2 | value7 | value8这不合法:value1 | value3 | value7

我需要弄清楚是否设置了值7,设置了value8,以及剩余的值是什么.

我有以下python代码.有没有更优雅的方式来做到这一点?

value1 = 0x01
value2 = 0x02
value3 = 0x03
value4 = 0x04
value5 = 0x05
value6 = 0x06
value7 = 0x40
value8 = 0x80

def format_byte_as_bits(value):
    return format(value,'b').zfill(8)

def mask_bits_on_byte(byte,mask):
    inverse_of_mask = mask ^ 0b11111111
    return byte & inverse_of_mask

def parse_byte(byte):

    value7_set = …
Run Code Online (Sandbox Code Playgroud)

python bit-manipulation

9
推荐指数
2
解决办法
4万
查看次数

pyserial - 可以从线程a写入串口,从线程b做阻塞读取吗?

我试过谷歌搜索,找不到答案,在这里搜索,找不到答案.有没有人研究从线程a写入Serial()对象(pyserial)是否是线程安全并从线程b执行阻塞读取?

我知道如何使用线程同步原语和线程安全的数据结构,事实上我这个程序的当前形式有一个专用于读取/写入串口的线程,我使用线程安全的数据结构来协调应用程序中的活动.

如果我可以从主线程写入串口(并且从不读取它),我的应用程序将受益匪浅,并使用第二个线程中的阻塞读取从串行端口读取(并且永远不会写入它).如果有人真的希望我进入为什么这会使应用程序受益,我可以添加我的理由.在我看来,只有一个Serial()实例,即使线程B位于Serial对象的阻塞读取中,线程A也可以安全地在Serial对象上使用write方法.

有人知道Serial类是否可以这样使用?

编辑:我觉得答案可能是平台依赖的.如果您对此类平台有任何经验,最好知道您正在使用哪个平台.

编辑:只有一个回复,但如果有其他人尝试过此,请留下您的经验回复.

python serial-port pyserial

9
推荐指数
1
解决办法
8288
查看次数