相关疑难解决方法(0)

从Python调用C/C++?

构建Python绑定到C或C++库的最快方法是什么?

(如果这很重要,我正在使用Windows.)

c c++ python

493
推荐指数
16
解决办法
39万
查看次数

从Ruby学习Python; 异同

我非常了解Ruby.我相信我现在可能需要学习Python.对于那些了解两者的人来说,两者之间的概念是相似的,哪些是不同的?

我正在寻找一个类似于我为JavaScripters学习Lua所做的入门的列表:简单的事情,如空白意义和循环结构; nilPython中的名称,以及哪些值被视为"truthy"; 是不是习惯于使用相当于mapeach/或笨拙的 东西 ,那些大概笨拙的常规吗?

如果我得到了各种各样的答案,我很乐意将它们汇总到社区维基中.或者你们都可以互相争斗,试图创造一个真正的综合名单.

编辑:要清楚,我的目标是"正确的"和惯用的Python.如果有一个Python的等价物inject,但是没有人使用它,因为有更好/不同的方法来实现迭代列表和累积结果的常用功能,我想知道你是如何做的.也许我会用一系列共同目标更新这个问题,如何在Ruby中实现它们,并询问Python中的等价物.

ruby python

129
推荐指数
5
解决办法
3万
查看次数

在上下文管理器中__init__ vs __enter__

据我了解,__init__()__enter__()上下文管理的方法调用一次每个,一个接一个,不留下任何机会之间执行任何其他代码.将它们分成两种方法的目的是什么,我应该将它们放入每种方法中?

编辑:对不起,没注意文档.

编辑2:实际上,我感到困惑的原因是因为我在想@contextmanager装饰师.使用创建的上下文管理器@contextmananger只能使用一次(第一次使用后生成器将耗尽),因此通常使用构造函数内部with语句编写; 如果这是使用with陈述的唯一方法,我的问题就有意义了.当然,实际上,情境管理者比@contextmanager可以创造的更为笼统; 特别是上下文管理器通常可以重用.我希望这次能做对吗?

python contextmanager python-3.x

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

为什么Python在对象之前销毁类变量?

我知道Python不保证在程序结束时破坏对象的顺序,甚至不会保证它会发生.

所以我理解一个类的析构函数不能依赖全局变量,包括其他模块.

但是我会想到在类被销毁之前必须销毁类的对象.显然不是:

class A(object):
    count = 0
    def __init__(self):
        A.count += 1
        print 'Creating object, there are now', A.count
    def __del__(self):
        A.count -= 1
        print 'Destroying object, there are now', A.count

a1 = A()
a2 = A()
Run Code Online (Sandbox Code Playgroud)

在Windows 7 x64 Python v2.7.3上,我得到:

Creating object, there are now 1
Creating object, there are now 2
Exception AttributeError: "'NoneType' object has no attribute 'count'" in <bound
 method A.__del__ of <__main__.A object at 0x0234B8B0>> ignored
Exception AttributeError: "'NoneType' object has no attribute …
Run Code Online (Sandbox Code Playgroud)

python destructor scope class

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

是否依赖于__del __()来清除python中的不可靠?

我阅读不同的方式来清理对象在Python中,我已经对这些问题跌跌撞撞(1,2)基本上说,清理使用__del__()是不可靠的,下面的代码应避免:

def __init__(self):
    rc.open()

def __del__(self):
    rc.close()
Run Code Online (Sandbox Code Playgroud)

问题是,我正在使用这个代码,我无法重现上述问题中引用的任何问题.据我所知,我不能用with声明来替代,因为我为闭源软件提供了一个Python模块(testIDEA,任何人?)这个软件将创建特定类的实例并处理它们,这些实例必须准备好在两者之间提供服务.__del__()我看到的唯一替代方法是手动调用open()close()根据需要,我认为这将非常容易出错.

我明白,当我关闭解释器时,不能保证我的对象会被正确销毁(并且它不会打扰我,哎呀,即使是Python作者也认为它没问题).除此之外,我是否通过__del__()清理来玩火?

PS:我最初想在meta上发布一个关于无法复制的错误问题的咆哮,但意识到我不会得到我需要的技术细节.

python destructor

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

在对象销毁时清理内部pysqlite连接

我有一个内部数据库连接的对象,它在整个生命周期中都是活动的.在程序运行结束时,必须提交和关闭连接.到目前为止,我已经使用了一个显式close方法,但这有点麻烦,特别是当调用代码中发生异常时.

我正在考虑使用这种__del__方法来关闭,但经过一些在线阅读后我有所顾虑.这是一种有效的使用模式吗?我可以确定内部资源是否可以__del__正确释放?

这次讨论提出了类似的问题但没有找到令人满意的答案 我不想有一个显式的close方法,并且使用with不是一个选项,因为我的对象不像开放式播放关闭那样简单,而是作为另一个更大的对象的成员保存,使用它在GUI中运行时.

C++有完美的工作析构函数,可以安全地释放资源,所以我认为Python也有同意的东西.由于某种原因,似乎并非如此,社区中的许多人发誓反对__del__.那么替代方案是什么?

python destructor pysqlite

7
推荐指数
2
解决办法
3345
查看次数

Python:无法使用super()调用父类析构函数

我无法从Child类的析构函数中调用Parent类的析构函数.请检查以下代码:

class BaseClass(object):
    def __del__(self):
        print 'BaseClass->Destructor'

class DerivativeClass(BaseClass):
    def __del__(self):
        print 'DerivativeClass->Destructor'
        #Invoke destructor of the base class, it works 
        BaseClass.__del__(self)           
        #Doesn't work
        #super(DerivativeClass, self).__del__() 

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

当我使用时super(DerivativeClass, self).__del__(),DerivativeClass.__del__()我收到以下错误:

Exception TypeError: 'must be type, not None' in <bound method 
DerivativeClass.__del__ of <__main__.DerivativeClass object at 0xb73a682c>> ignored
Run Code Online (Sandbox Code Playgroud)

题:

为什么我不能super在子类的析构函数中使用它,而它在子类的构造函数中完全没问题?

python destructor super

6
推荐指数
1
解决办法
3848
查看次数

与线程类中的__init__相反

我知道当你创建一个类newThread = MyThread(property)并且run()被触发时会自动调用__init __()newthread.start().我正在寻找的是在线程终止之前自动调用的东西,所以我不必self.cleanUp()在每个return语句之前显式调用.

class MyThread(Thread): 

    def __init__(self, property): 
        Thread.__init__(self)
        self.property = property

    def cleanUp(self):
        # Clean up here

    def run(self):
        # Do some stuff
        self.cleanUp() # Current work around
        return
Run Code Online (Sandbox Code Playgroud)

python

6
推荐指数
1
解决办法
2037
查看次数

PyDev中假未解决的导入错误

PyDev报告了不存在的导入错误.最初的症状是一个假的"未解决的导入"错误,它由以下组合修复:

  • 清洁项目
  • 重新索引项目(删除解释器,再次添加)
  • 重启Eclipse
  • 向蟒蛇神焚烧香

现在错误是"导入的未验证变量" - 它似乎无法找到pymssql.connect.

这不是PYHTONPATH问题.我可以很好地访问模块,文件中的代码(涉嫌)错误运行正常 - 它有单元测试和生产代码调用它.

错误发生在PyDev中:我向PyDev项目添加了一个新模块,错误只发生在新模块中.我已经尝试了以上所有内容.


所以,我打算在其他地方发布这个代码来征求关于设计的一些评论,我在评论中被要求发布代码.(灵感来自:数据库连接包装器和Clint Miller对这个问题的回答:如何正确清理Python对象?).导入错误发生在第69行(self.connection = pymssql.connect ...).不知道这回答这个问题有什么好处,但......

import pymssql
from util.require_type import require_type

class Connections(object):
    @require_type('host', str)
    @require_type('user', str)
    @require_type('password', str)
    @require_type('database', str)
    @require_type('as_dict', bool)
    def __init__(self, host, user, password, database, as_dict=True):
        self.host = host
        self.user = user
        self.password = password
        self.db = database
        self.as_dict = as_dict

    @staticmethod
    def server1(db):
        return Connections('','','','')

    @staticmethod
    def server2(db):
        pass

    @staticmethod
    def server3(db):
        pass


class DBConnectionSource(object):
    # Usage:
    #        with …
Run Code Online (Sandbox Code Playgroud)

python eclipse pydev

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

__enter__`方法的返回值在python中应始终为`self`吗?

__enter__方法的返回值不应该self始终是。

Python文档说:

object.__enter__(self) 输入与此对象相关的运行时上下文。with语句会将此方法的返回值绑定到该语句的as子句中指定的目标(如果有)。

这样做,为了做任何实际的事情,不self应该总是从__enter__类的方法中返回它,否则,就不能从上下文中调用其他类方法。

例如,在下面的代码中,s.main()可以正常工作,但b1.main()会出错。

class a(object):
    def __init__(self):
        pass

    def __enter__(self):
        return self

    def __exit__(self ,type, value, traceback):
        return self

    def main(self):
        print " in a::main self %d " , id(self)


class b(object):
    def __init__(self):
        pass

    def __enter__(self):
        return "something else"

    def __exit__(self ,type, value, traceback):
        pass

    def main(self):
        print "in b::main !! self id " , id(self)

with a() as s:
    s.main()

with b() as b1:
    b1.main()

s …
Run Code Online (Sandbox Code Playgroud)

python

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

标签 统计

python ×10

destructor ×4

c ×1

c++ ×1

class ×1

contextmanager ×1

eclipse ×1

pydev ×1

pysqlite ×1

python-3.x ×1

ruby ×1

scope ×1

super ×1