我正在使用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)
它是否正确?这是我想要实现的一般情况吗?有竞争条件吗?
谢谢!
我有一些用户可以看到某个视图.
为了让用户登录并抱怨了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标志由两个LoginRequiredMixin和PermissionRequiredMixin,我不能将其设置为任何东西.
raise_exception是True,则未登录的用户收到403 Forbidden(我不想要).raise_exception是False,那就是用户没有允许看到的视图,将被重定向到登录页面使用它,因为用户登录时,将再次重定向到该页面.创建一个完全没有花哨的重定向循环.当然我可以实现我自己的mixin行为我期望的行为,但是在视图本身中是否有任何Django方式?(不在urls.py)
我找到了一些有关如何在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 实现等效的解决方案。有可能吗?我需要什么验证器?我尝试重构一些东西,但无法得到任何可用的东西。
我想知道是否有可能将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)
对于更复杂的类,将它们写入一个单元格真的很烦人.我想将每种方法放在不同的单元格中.
有人在去年做了这个,但我想知道是否有东西内置,所以我不需要外部脚本/导入.
如果没有,我想知道是否有理由不给你机会分割你的代码和文档/调试它更容易.
提前致谢
我发现了与此问题相关的一些模糊的问题,但没有找到任何针对CPython的干净且特定的解决方案。我认为“有效”解决方案是特定于解释器的。
首先,我认为我了解:
locals() 给出了不可修改的字典。frame.f_locals给出了locals()类似的字典,但不太容易通过hackhacking exec。或至少我没有能力做些骇人听闻的未证明的事情,例如locals()['var'] = value ; exec ""exec 能够对局部变量做一些奇怪的事情,但它并不可靠-例如,我读到某处它在Python 3中不起作用。未经测试。因此,我了解到,鉴于这些限制,向局部变量添加额外的变量永远是不安全的,因为这会破坏解释器的结构。
但是,应该可以更改已经存在的变量,不是吗?
我考虑过的事情
f,可以访问f.func_code.co_nlocals和f.func_code.co_varnames。frame.f_locals。这是通过设置跟踪器的用例sys.settrace。变量应该在某个地方,最好是可写的...但是我找不到它。即使它是一个数组(用于有效的解释器访问),或者我需要一些额外的C特定接线,我也准备提交。
如何从跟踪函数或修饰的包装函数或类似的东西实现对变量的修改?
完整的解决方案当然会受到赞赏,但即使是某些指针也会对我有很大帮助,因为我在这里遇到了很多不可写的字典:-/
我有一个名为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) 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的参数变化?
我有类似以下内容
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) 我想初始化一个包含一些数据的数组。我创建了一个随机矩阵(使用np.empty),然后将其乘以np.nan。有什么问题吗?或者我应该坚持更好的做法吗?
进一步解释我的情况:我有需要存储在数组中的数据。假设我有 8 行数据。每行的元素数不相等,所以我的矩阵行长度需要和最长的行一样长。在其他行中,某些元素将不会被填充。我不想使用零,因为我的一些数据实际上可能是零。
我意识到我可以使用一些我知道我的数据永远不会使用的值,但 nans 绝对更清晰。只是想知道这是否会导致以后的处理出现任何问题。我意识到我需要使用nanmax代替max等等。