小编Nik*_*s R的帖子

如何使用插件提供扩展Python程序的API?

我想知道如何为我的Python程序提供API以使其他人能够使用插件扩展它.我想到了类似的东西from myProgram.plugins import aClassToExtendByOthers, registerThatClass.但我不知道如何提供这个.

我可以在我的loadPlugins函数中为plugins-folder中的每个插件使用一个exec语句,但这不会导致我想要为人们编写这些插件的内容.

python api plugins extend

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

我应该在大量使用的函数上使用`inline`吗?

我有一个cnVector代表三维空间中一个点的类.它的运算符+ - */被密集使用.
他们的实施很短:

cnVector cnVector::operator + (const cnVector& v) const {
    return cnVector(
        x + v.x,
        y + v.y,
        z + v.z );
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,因为这个功能很短,我应该内联它虽然它的密集使用?或者将使用它时,它产生太多的代码多少?

c++ inline

5
推荐指数
2
解决办法
178
查看次数

常数和糖

我有一组经常使用的函数,所以我想在库中收集它们.在我开始编写库之前,我在考虑在哪里存储影响某些函数行为的常量.

使用该库时我想写的内容如下:

import tools
tools.collect(object_a, object_b, mode=tools.collect.RECURSIVE)
Run Code Online (Sandbox Code Playgroud)

一般来说,函数应该能够接受的常量应该存储在函数本身中.

为了实现这一点,我创建了一个装饰器函数,将传递的属性分配给修饰函数.

def attr_decorator(**attrs):
    def decorator(f):
        for k, v in attrs.iteritems():
            setattr(f, k, v)
        return f
    return decorator
Run Code Online (Sandbox Code Playgroud)

这个装饰器可以像这样使用:

@attr_decorator(
    FLAT = 1 << 0,
    RECURSIVE 1 << 1,
)
def collect(a, b, mode):
    # ...
Run Code Online (Sandbox Code Playgroud)

到目前为止这个工作非常好.

但是默认参数呢?

@attr_decorator(
    FLAT = 1 << 0,
    RECURSIVE 1 << 1,
)
def collect(a, b, mode=collect.RECURSIVE):
    # ...
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为在存储mode参数的default-value时未定义collect函数(因此甚至没有修饰).

这看起来不太好看

我能够提出的唯一解决方案导致了一种笨拙的语法,它看起来并不好看.我给装饰器函数提供了与要装饰的函数相同的属性.

def attr_decorator(**attrs):
    def decorator(f):
        for k, v in attrs.iteritems():
            setattr(f, k, …
Run Code Online (Sandbox Code Playgroud)

python constants decorator syntactic-sugar

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

C++未初始化的类实例数组

我一直在寻找,但无法找到答案.有没有办法告诉new操作员不要调用类构造函数?

MyObject* array = new MyObject[1000];
Run Code Online (Sandbox Code Playgroud)

这将召唤MyObject()一千次!我想自己填充分配的内存,不需要在构造函数中初始化任何信息.使用malloc()不是非常和谐的C++代码imho.

MyObject* array = (MyObject*) malloc(sizeof(MyObject) * 1000);
Run Code Online (Sandbox Code Playgroud)

c++ initialization new-operator alloc

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

Jinja 模板中的惰性变量查找

我想使用实现接口的自定义对象来渲染 Jinja2 模板__getitem__。该对象实现了惰性变量查找,因为不可能从中创建字典(可用变量的数量几乎是无限的,值检索在查询的键上动态工作)。

是否可以使用上下文对象渲染 Jinja2 模板?

# Invalid code, but I'd like to have such an interface.
#

from jinja2 import Template

class Context(object):

    def __getitem__(self, name):
        # Create a value dynamically based on `name`
        if name.startswith('customer'):
             key = name[len('customer_'):]
             return getattr(get_customer(), key)
        raise KeyError(name)

t = Template('Dear {{ customer_first }},\n')
t.render(Context())
Run Code Online (Sandbox Code Playgroud)

python templates jinja2

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

except-clause删除局部变量

exc = None
try:
    raise Exception
except Exception as exc:
    pass

# ...

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

NameError:未定义名称'exc'

这曾经在Python2中工作.为什么这样改变了?如果我至少可以重新分配exc,类似于类级属性

class Foo(object):
    Bar = Bar
Run Code Online (Sandbox Code Playgroud)

但这也不能使它工作:

exc = None
try:
    raise Exception
except Exception as exc:
    exc = exc
Run Code Online (Sandbox Code Playgroud)

有什么好的提示可以实现同样的目标吗?我不想写这样的东西:

exc = None
try:
    raise Exception("foo")
except Exception as e:
    exc = e

# ...

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

python scope python-3.x try-except

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

zipimporter无法找到/加载子模块

我正在尝试从ZIP包中加载子模块,但它不起作用.怎么做对了?

foo.zip

foo/
    __init__.py
   bar.py
Run Code Online (Sandbox Code Playgroud)

test.py

import os
import zipimport

dirname = os.path.dirname(__file__)
importer = zipimport.zipimporter(os.path.join(dirname, 'foo.zip'))
print importer.is_package('foo')
print importer.load_module('foo')
print importer.load_module('foo.bar')
Run Code Online (Sandbox Code Playgroud)

产量

$ python test.py
True
<module 'foo' from 'foo.zip/foo/__init__.py'>
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print importer.load_module('foo.bar')
zipimport.ZipImportError: can't find module 'foo.bar'
Run Code Online (Sandbox Code Playgroud)

更新 2015/04/11 06:30 AM

以下是可行的,但这是问题的真正解决方案吗?该zipimport.zipimporter文档明确声明"fullname必须是完全限定(虚线)模块名称." 并有一个is_package()似乎正常运行的方法.

import os
import zipimport

dirname = os.path.dirname(__file__)
importer = zipimport.zipimporter(os.path.join(dirname, 'foo.zip'))

def load_module(name):
    parts = name.split('.')
    module = importer.load_module(parts[0]) …
Run Code Online (Sandbox Code Playgroud)

python import python-2.7

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

pip 和 setuptools 之间的 data_files 差异

我有一个带有setup.py脚本的 Python 应用程序,可以通过 Pip 或 setuptools 安装。但是,我发现这两种方法之间存在一些烦人的差异,我想知道分发数据文件的正确方法

import glob
import setuptools

long_description = ''
setuptools.setup(
  name='creator-build',
  version='0.0.3-dev',
  description='Meta Build System for Ninja',
  long_description=long_description,
  author='Niklas Rosenstein',
  author_email='rosensteinniklas@gmail.com',
  url='https://github.com/creator-build/creator',
  py_modules=['creator'],
  packages=setuptools.find_packages('.'),
  package_dir={'': '.'},
  data_files=[
    ('creator', glob.glob('creator/builtins/*.crunit')),
  ],
  scripts=['scripts/creator'],
  classifiers=[
    "Development Status :: 5 - Production/Stable",
    "Programming Language :: Python",
    "Intended Audience :: Developers",
    "Topic :: Utilities",
    "Topic :: Software Development :: Libraries",
    "Topic :: Software Development :: Libraries :: Python Modules",
    ],
  license="MIT",
)
Run Code Online (Sandbox Code Playgroud)
  1. 使用Pip,指定的文件data_files …

installation pip data-files setuptools python-3.x

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

类型提示的正确类型提示是什么?

我有一个接受类型提示作为函数参数的用例。但是接受类型提示的正确类型提示是什么?

T = TypeVar('T', bound='TypeHintType')

def register_handler(type_hint: T, handler: Handler[T]) -> None:
    ...
Run Code Online (Sandbox Code Playgroud)

是否有一个“TypeHintType”可以用来注释类型提示作为参数?

python type-annotation

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

如果管道已满,写入管道的进程是否会阻塞?

我目前潜入的Win32 API,写我自己的包装类CreateProcessCreatePipe。我只是想知道如果我打开的进程为管道缓冲区写入过多的输出会发生什么。该过程会等到我从管道的另一端读取吗?该CreatePipe函数的备注表明:

当进程使用 WriteFile 写入匿名管道时,直到写入所有字节后,写入操作才会完成。如果在写入所有字节之前管道缓冲区已满,则 WriteFile 不会返回,直到另一个进程或线程使用 ReadFile 来提供更多可用缓冲区空间。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365152%28v=vs.85%29.aspx

让我们假设我打开一个进程CreateProcess,然后使用WaitForSingleObject等待进程退出。如果进程超过其标准输出管道的缓冲区大小,它会退出吗?

c winapi pipe createprocess

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