小编Mar*_*ram的帖子

Python多线程多解释器C API

我正在使用Python的C API,但很难理解一些极端情况.我可以测试它,但它似乎容易出错并且耗费时间.所以我来这里看看有人已经这样做了.

问题是,哪个是使用子解释器管理多线程的正确方法,线程和子解释器之间没有直接关系?

Py_Initialize();
PyEval_InitThreads(); /* <-- needed? */
_main = PyEval_SaveThread(); /* <-- acquire lock? does it matter? */
/* maybe do I not need it? */
i1 = Py_NewInterpreter();
i2 = Py_NewInterpreter();
Run Code Online (Sandbox Code Playgroud)

我是否使用互斥锁?是否需要使用锁?线程函数应该类似于以下内容:(线程是非python,可能是POSIX线程)

线程1

_save = PyThreadState_Swap(i1);
  // python work 
PyThreadState_Restore(_save);
Run Code Online (Sandbox Code Playgroud)

Thread2(几乎相同)

_save = PyThreadState_Swap(i1);
  // python work 
PyThreadState_Restore(_save);
Run Code Online (Sandbox Code Playgroud)

Thread3(几乎相同,但与子解释器i2)

_save = PyThreadState_Swap(i2);
  // python work 
PyThreadState_Restore(_save);
Run Code Online (Sandbox Code Playgroud)

它是否正确?这是我想要实现的一般情况吗?有竞争条件吗?

谢谢!

python multithreading python-c-api

20
推荐指数
1
解决办法
4704
查看次数

可以将PermissionRequiredMixin和LoginRequiredMixin合并吗?

我有一些用户可以看到某个视图.

为了让用户登录并抱怨了403 Forbidden为这些用户不能看到登录,我可以使用下面的(如解释在这里):

@permission_required('polls.can_vote', raise_exception=True)
@login_required
def my_view(request):
    ...
Run Code Online (Sandbox Code Playgroud)

这确实按预期工作.但我的所有观点都是基于类的观点.自从Django 1.9(最终!)以来,有很多漂亮的mixins用于处理只能通过装饰器完成的事情.然而...

class MyClassView(LoginRequiredMixin, PermissionRequiredMixin, TemplateView):
    raise_exception = <???>
    permission_required = 'polls.can_vote'
    template_name = 'poll_vote.html'
Run Code Online (Sandbox Code Playgroud)

这不起作用.由于该raise_exception标志由两个LoginRequiredMixinPermissionRequiredMixin,我不能将其设置为任何东西.

  • 如果raise_exceptionTrue,则未登录的用户收到403 Forbidden(我不想要).
  • 如果raise_exceptionFalse,那就是用户没有允许看到的视图,将被重定向到登录页面使用它,因为用户登录时,将再次重定向到该页面.创建一个完全没有花哨的重定向循环.

当然我可以实现我自己的mixin行为我期望的行为,但是在视图本身中是否有任何Django方式?(不在urls.py)

django django-1.9

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

在 Pydantic v2 中使用 bson.ObjectId

我找到了一些有关如何在BaseModel类中使用 ObjectId 的示例。基本上,这可以通过创建 Pydantic 友好的类来实现,如下所示:

class PyObjectId(ObjectId):
    @classmethod
    def __get_validators__(cls):
        yield cls.validate

    @classmethod
    def validate(cls, v):
        if not ObjectId.is_valid(v):
            raise ValueError("Invalid objectid")
        return ObjectId(v)

    @classmethod
    def __modify_schema__(cls, field_schema):
        field_schema.update(type="string")
Run Code Online (Sandbox Code Playgroud)

然而,这似乎适用于 Pydantic v1,因为该机制已被__get_pydantic_core_schema__classmethod 取代。但是,我无法使用 Pydantic v2 实现等效的解决方案。有可能吗?我需要什么验证器?我尝试重构一些东西,但无法得到任何可用的东西。

python bson pydantic

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

Jupyter - 多个单元格中的分割类

我想知道是否有可能将jupyter类分成不同的单元格?让我们说:


#first cell:
class foo(object):
    def __init__(self, var):
        self.var = var
Run Code Online (Sandbox Code Playgroud)
#second cell
    def print_var(self):
       print(self.var)
Run Code Online (Sandbox Code Playgroud)

对于更复杂的类,将它们写入一个单元格真的很烦人.我想将每种方法放在不同的单元格中.

有人在去年做了这个,但我想知道是否有东西内置,所以我不需要外部脚本/导入.

如果没有,我想知道是否有理由不给你机会分割你的代码和文档/调试它更容易.

提前致谢

python jupyter-notebook

8
推荐指数
2
解决办法
3391
查看次数

修改locals()或frame.f_locals中的* existing *变量

我发现了与此问题相关的一些模糊的问题,但没有找到任何针对CPython的干净且特定的解决方案。我认为“有效”解决方案是特定于解释器的。

首先,我认为我了解:

  • locals() 给出了不可修改的字典。
  • 函数可以(并且确实确实)使用某种优化来访问其局部变量
  • frame.f_locals给出了locals()类似的字典,但不太容易通过hackhacking exec。或至少我没有能力做些骇人听闻的未证明的事情,例如locals()['var'] = value ; exec ""
  • exec 能够对局部变量做一些奇怪的事情,但它并不可靠-例如,我读到某处它在Python 3中不起作用。未经测试。

因此,我了解到,鉴于这些限制,向局部变量添加额外的变量永远是不安全的,因为这会破坏解释器的结构。

但是,应该可以更改已经存在的变量,不是吗?

我考虑过的事情

  • 在一种功能中f,可以访问f.func_code.co_nlocalsf.func_code.co_varnames
  • 在一个框架中,可以通过访问/检查/读取变量frame.f_locals。这是通过设置跟踪器的用例sys.settrace
  • 可以很容易地访问框架所在的功能-结合使用设置跟踪的用例,并使用它在给定触发器或任何给定局部变量的情况下“执行操作”。

变量应该在某个地方,最好是可写的...但是我找不到它。即使它是一个数组(用于有效的解释器访问),或者我需要一些额外的C特定接线,我也准备提交。

如何从跟踪函数或修饰的包装函数或类似的东西实现对变量的修改?

完整的解决方案当然会受到赞赏,但即使是某些指针也会对我有很大帮助,因为我在这里遇到了很多不可写的字典:-/


编辑:hackish的exec是做这样的事情还是

python cpython

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

python:奇怪的str.contains行为

我有一个名为df的数据帧为df = pd.read_csv('my.csv')

    CUSTOMER_MAILID                       EVENT_GENRE       EVENT_LANGUAGE  
0   000.tushar@gmail.com                    |ROMANCE|          Hindi   
1   000.tushar@gmail.com                      |DRAMA|          TAMIL   
2        satya@gmail.com                    |ROMANCE|          Hindi   
3   000.tushar@gmail.com                      |DRAMA|          Hindi   
4          sat@gmail.com    |ACTION|ADVENTURE|SCI-FI|        English   
5   000.tushar@gmail.com    |ACTION|ADVENTURE|COMEDY|        English   
6       fdvklf@gmail.com                     |ACTION|          Hindi   
7        asdar@gmail.com                      |DRAMA|          Hindi   
8       dfvkme@gmail.com     |FANTASY|HORROR|ROMANCE|        English   
9   000.tushar@gmail.com  |ACTION|ADVENTURE|THRILLER|        English   
10        king@gmail.com                      |DRAMA|          Hindi   
11  000.tushar@gmail.com           |ROMANCE|THRILLER|        KANNADA   
12  000.tushar@gmail.com                      |DRAMA|          Hindi   
13  000.tushar@gmail.com     |ACTION|ADVENTURE|DRAMA|        English   
14      iamher@gmail.com     |ACTION|ADVENTURE|DRAMA|         TELUGU   
15  000.tushar@gmail.com               |BIOPIC|DRAMA|          Hindi   
16    0007ayan@gmail.com            |HORROR|THRILLER|          Hindi   
17    0007ayan@gmail.com     |ACTION|COMEDY|THRILLER|           ODIA   
18  000.tushar@gmail.com …
Run Code Online (Sandbox Code Playgroud)

python string pandas

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

如何在Python中忽略额外的关键字参数?

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

def foo(d):
    return Test(**d)

# this works well
d = {'id': 'aaa', 'name': 'aaa-name'?
foo(d)
# this would not work well, because of parameter variations, a external para     add into dict d. 
d = {'id': 'aaa', 'name': 'aaa-name', 'test1': 'test1'?

# traceback
TypeError: __init__() got an unexpected keyword argument 'test1'
Run Code Online (Sandbox Code Playgroud)

是否有任何方法可以忽略dict d的参数变化?

python

3
推荐指数
2
解决办法
2933
查看次数

constexpr用于派生类中的null-initialized构造函数

我有类似以下内容

class Base {
public:
    explicit Base(int* i) noexcept { type = new int; *type = *i; };
    constexpr Base(std::nullptr_t) : type(nullptr) { };
    ~Base() { cout << "Destroying!" << endl; delete type; };
protected:
    int* type;
};


class Derived : public Base {
public:
    explicit Derived(int* i) noexcept : Base(i) { };
    //constexpr Derived(std::nullptr_t) : type(nullptr) { };
    //constexpr Derived(std::nullptr_t) : Base(nullptr) { };
    ~Derived() { };
};
Run Code Online (Sandbox Code Playgroud)

我想constexpr为派生类实现一些null构造函数,但编译器对我所做的两个选项和类似测试抱怨很多.

当然代码更复杂,我有一个不透明的处理程序,析构函数应该以更复杂的方式运行.资源自由总是相同的(不需要多个析构函数,只需要Base一个).

我不知道如何实现这一点,也许我正走错路?有任何想法吗?我希望能够做到这样的事情:

Derived a(nullptr);
Derived b(handler1); …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

python数组初始化(预分配)与nans

我想初始化一个包含一些数据的数组。我创建了一个随机矩阵(使用np.empty),然后将其乘以np.nan。有什么问题吗?或者我应该坚持更好的做法吗?

进一步解释我的情况:我有需要存储在数组中的数据。假设我有 8 行数据。每行的元素数不相等,所以我的矩阵行长度需要和最长的行一样长。在其他行中,某些元素将不会被填充。我不想使用零,因为我的一些数据实际上可能是零。

我意识到我可以使用一些我知道我的数据永远不会使用的值,但 nans 绝对更清晰。只是想知道这是否会导致以后的处理出现任何问题。我意识到我需要使用nanmax代替max等等。

python numpy pre-allocation

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