小编Sin*_*ion的帖子

Python hashable dicts

作为一个练习,主要是为了我自己的娱乐,我正在实现一个回溯包装解析器.对此的灵感是我想更好地了解hygenic宏如何在类似algol的语言中工作(与你通常在其中找到的语法免费lisp方言相对应).因此,通过输入的不同传递可能会看到不同的语法,因此缓存的解析结果无效,除非我还存储语法的当前版本以及缓存的解析结果.(编辑:使用键值集合的结果是它们应该是不可变的,但我不打算公开接口以允许它们被更改,因此可变或不可变集合都可以)

问题是python dicts不能作为其他dicts的键.即使使用元组(正如我将要做的那样)也无济于事.

>>> cache = {}
>>> rule = {"foo":"bar"}
>>> cache[(rule, "baz")] = "quux"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> 
Run Code Online (Sandbox Code Playgroud)

我想它必须一直是元组.现在python标准库提供了我所需要的,collections.namedtuple具有非常不同的语法,但可以用作键.继续上述会议:

>>> from collections import namedtuple
>>> Rule = namedtuple("Rule",rule.keys())
>>> cache[(Rule(**rule), "baz")] = "quux"
>>> cache
{(Rule(foo='bar'), 'baz'): 'quux'}
Run Code Online (Sandbox Code Playgroud)

好.但是我必须为我想要使用的规则中的每个可能的键组合创建一个类,这不是那么糟糕,因为每个解析规则确切地知道它使用了什么参数,因此可以同时定义该类作为解析规则的函数.

编辑:namedtuples 的另一个问题是它们是严格定位的.两个看起来应该不同的元组实际上可以是相同的:

>>> you = namedtuple("foo",["bar","baz"])
>>> me = namedtuple("foo",["bar","quux"])
>>> you(bar=1,baz=2) == me(bar=1,quux=2)
True
>>> bob = namedtuple("foo",["baz","bar"]) …
Run Code Online (Sandbox Code Playgroud)

python

79
推荐指数
7
解决办法
5万
查看次数

获取argparse中的其余参数

我想立刻获得所有剩余的未使用的参数.我该怎么做?

parser.add_argument('-i', action='store', dest='i', default='i.log')
parser.add_argument('-o', action='store', dest='o', default='o.log')
Run Code Online (Sandbox Code Playgroud)

python argparse

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

什么是"typedef void(*Something)()"的意思

我试图理解这意味着什么,我正在看的代码

在.h

typedef void (*MCB)();
static MCB     m_process;
Run Code Online (Sandbox Code Playgroud)

在.C

MCB Modes::m_process = NULL;
Run Code Online (Sandbox Code Playgroud)

有时当我做的时候

m_process();
Run Code Online (Sandbox Code Playgroud)

我得到了分段错误,这可能是因为内存被释放了,我怎样才能在它被释放时进行调试?

我希望我的问题很清楚.

c++ typedef static-members void-pointers

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

大型CSV文件(numpy)上的内存不足

我有一个3GB的CSV文件,我尝试用python读取,我需要明智的中间列.

from numpy import * 
def data():
    return genfromtxt('All.csv',delimiter=',')

data = data() # This is where it fails already.

med = zeros(len(data[0]))
data = data.T
for i in xrange(len(data)):
    m = median(data[i])
    med[i] = 1.0/float(m)
print med
Run Code Online (Sandbox Code Playgroud)

我得到的错误是这样的:

Python(1545) malloc: *** mmap(size=16777216) failed (error code=12)

*** error: can't allocate region

*** set a breakpoint in malloc_error_break to debug

Traceback (most recent call last):

  File "Normalize.py", line 40, in <module>

  data = data()

  File "Normalize.py", line 39, in data

  return genfromtxt('All.csv',delimiter=',') …
Run Code Online (Sandbox Code Playgroud)

python memory csv numpy scipy

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

在Cython中使用缓冲区API

我正在使用一个C库,它重复调用用户提供的函数指针以获取更多数据.我想以这样的方式,Python实现该回调可以返回任何合理的数据类型写一个用Cython包装一样str,bytearray,内存映射文件等(具体而言,支持缓冲接口).到目前为止我所拥有的是:

from cpython.buffer cimport PyBUF_SIMPLE
from cpython.buffer cimport Py_buffer
from cpython.buffer cimport PyObject_GetBuffer
from cpython.buffer cimport PyBuffer_Release
from libc.string cimport memmove

cdef class _callback:
    cdef public object callback
    cdef public object data

cdef uint16_t GetDataCallback(void * userdata,
                              uint32_t wantlen, unsigned char * data,
                              uint32_t * gotlen):

    cdef Py_buffer gotdata
    box = <_callback> userdata
    gotdata_object = box.callback(box.data, wantlen)
    if not PyObject_CheckBuffer(gotdata_object):
        # sulk
        return 1

    try:
        PyObject_GetBuffer(gotdata_object, &gotdata, PyBUF_SIMPLE)

        if not (0 < gotdata.len <= …
Run Code Online (Sandbox Code Playgroud)

python memory-management cython pybuffer pep3118

21
推荐指数
1
解决办法
2096
查看次数

为什么我要两次输入ctrl-d?

为了我自己的娱乐,我已经编写了一个python脚本,允许我使用python进行bash one-liners; 提供python生成器表达式; 并且脚本遍历它.这是脚本:

DEFAULT_MODULES = ['os', 're', 'sys']

_g = {}
for m in DEFAULT_MODULES:
    _g[m] = __import__(m)

import sys
sys.stdout.writelines(eval(sys.argv[1], _g))
Run Code Online (Sandbox Code Playgroud)

这就是你如何使用它.

$ groups | python pype.py '(l.upper() for l in sys.stdin)'
DBORNSIDE
$ 
Run Code Online (Sandbox Code Playgroud)

对于预期用途,它完美地工作!

但是当我不用管道输入它并直接调用它时,例如:[强调添加以显示我键入的内容]

$ python pype.py '("%r\n" % (l,) for l in sys.stdin)'
fooEnter
barEnter
bazEnter
Ctrl DCtrl D'foo\n'
'bar\n'
'baz\n'
$ 

为了停止接受输入并产生任何输出,我必须要么键入Enter- Ctrl D- Ctrl DCtrl D- - .Ctrl D Ctrl …

python tty eof

16
推荐指数
1
解决办法
3321
查看次数

gvim长多行字符串突出显示

我在我的python源代码中广泛使用多行文档字符串来包含doctests.不幸的是,vim/gvim似乎很难用语法高亮显示,偶尔丢失它的位置并忘记它位于字符串文字的中间,并突出显示从字符串到源和源到字符串"翻转".

我可以向上滚动到顶部并再次向下滚动,而vim 通常可以解决问题,但有时需要几次尝试.

除了让我的文档更短,有没有办法帮助vim按顺序保持对这些长文字的突出显示?

vim syntax-highlighting

14
推荐指数
1
解决办法
1141
查看次数

装饰器逐行记录功能执行

我正在编写一个需要几分钟才能运行的脚本,并希望向用户提供有关其进度的一些输出.不幸的是,我非常懒惰.我想要做的是编写一个没有日志记录的函数,然后应用一个装饰器,它会逐步执行该函数并在执行该行之前打印每一行.基本上我正在寻找的是loggingdecorator这样的:

>>> @loggingdecorator
... def myfunction():
...     foo()
...     bar()
...     baz()
>>> myfunction()
Starting myfunction
foo() ... [OK]
bar() ... [OK]
baz() ... [OK]
myfunction Done!
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所尝试的:

import sys


def logging_tracer(frame, event, arg):
    def local_tracer(local_frame, event, arg):
        if frame is local_frame:
            print frame.f_code.co_name, event, arg

    print frame.f_code.co_name, event, arg
    return local_tracer


def loggingdecorator(func):
    def _wrapper():
        old_trace_function = sys.gettrace()
        sys.settrace(logging_tracer)
        try:
            result = func()
        except:
            raise
        else:
            return result
        finally:
            sys.settrace(old_trace_function)
    return _wrapper
Run Code Online (Sandbox Code Playgroud)

不幸的是,这打印得太多了; 它跟随函数调用并逐行打印出来(好吧,这实际上不打印源代码行,现有的答案使用inspect,结合跟踪函数中的框架对象上的东西就可以了),但是我有点难过,logging_tracer除非有问题的功能实际装饰.

python logging

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

AttributeError:'unicode'对象没有属性'_sa_instance_state'

我只是学习如何使用SQLAlchemy.我正在尝试执行以下操作,但将标题和链接存储在两个单独的表中:

temp = Submissions(title=u'Facebook Homepage', link=u'http://facebook.com')
session.add(temp)
session.flush()
transaction.commit()
Run Code Online (Sandbox Code Playgroud)

通过:

class Links(Base):
    __tablename__ = 'links'
    id = Column(Integer, primary_key=True)
    link = Column(Text)
    created = Column(TIMESTAMP(), default=datetime.now())

    def __init__(self, link):
        self.link = link

class Submissions(Base):
    __tablename__ = 'submissions'
    id = Column(Integer, primary_key=True)
    created = Column(TIMESTAMP(), default=datetime.now())
    title = Column(Text)
    link_id = Column(Integer, ForeignKey('links.id'))
    link = relation(Links)

    def __init__(self, title, link):  
        self.title = title
        self.link = link
Run Code Online (Sandbox Code Playgroud)

但是,我总是得到这个错误:

AttributeError: 'unicode' object has no attribute '_sa_instance_state'
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?有没有更好的方法来编码?

python sqlalchemy

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

python set .__ contains__的意外行为

借用文档中的__contains__文档

print set.__contains__.__doc__
x.__contains__(y) <==> y in x.
Run Code Online (Sandbox Code Playgroud)

这似乎适用于原始对象,如int,basestring等.但对于定义__ne____eq__方法的用户定义对象,我得到意外的行为.这是一个示例代码:

class CA(object):
  def __init__(self,name):
    self.name = name

  def __eq__(self,other):
    if self.name == other.name:
      return True
    return False

  def __ne__(self,other):
    return not self.__eq__(other)

obj1 = CA('hello')
obj2 = CA('hello')

theList = [obj1,]
theSet = set(theList)

# Test 1: list
print (obj2 in theList)  # return True

# Test 2: set weird
print (obj2 in theSet)  # return False  unexpected

# Test 3: iterating over the set …
Run Code Online (Sandbox Code Playgroud)

python list set

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