给定以下 Python 数据类层次结构:
@dataclass
class A:
a: str
aa: str
@dataclass
class B(A):
b: str
@dataclass
class C(A):
c: str
@dataclass
class D(B, C):
d: str
Run Code Online (Sandbox Code Playgroud)
是否有任何通用方法允许您在此继承层次结构中插入具有默认值的属性?例如,以下内容会产生Non-default argument(s) follows default argument(s) defined in 'B'class 错误D。
@dataclass
class A:
a: str
aa: str
@dataclass
class B(A):
b: str = 'b' # <-- default value
@dataclass
class C(A):
c: str
@dataclass
class D(B, C):
d: str
Run Code Online (Sandbox Code Playgroud)
我想一种解决方案可能是为层次结构中的所有属性提供默认值None,并添加一个__post_init__()验证,如果任何属性为 ,则会引发一些异常None,但这似乎不正确,并且您在层次结构中的每个数据类中都需要它。
Python 3.7 数据类中的类继承提出了一种解决方案,您可以在继承层次结构中创建两个独立的分支;一种用于默认值,另一种不使用。这里的缺点是层次结构很快就会被很多类弄乱,但如果没有更好的选择,我想这已经是最好的了。 …
我在C++中有以下函数调用:
int strLength = 20;
char* name;
getName(name, strLength);
printf("name: %s\n", name);
Run Code Online (Sandbox Code Playgroud)
在Fortran:
subroutine getName(name) bind (c, name='GETNAME')
use,intrinsic :: iso_c_binding
implicit none
character, intent(out) :: name
name = 'Martin'
end subroutine getName
Run Code Online (Sandbox Code Playgroud)
当我执行C++例程时,输出为:name: M.现在,我想这是因为character, intent(out) :: name声明了name大小为1 的变量,但如果我将声明更改为:character(len=6), intent(out) :: name我收到此错误消息:Error: Character argument 'name' at (1) must be length 1 because procedure 'getname' is BIND(C).我也试过这个:character(len=6,kind=c_char), intent(out) :: name,同样的错误信息.最后,我尝试了这个声明:character(c_char),dimension(6), intent(out) :: name,编译,但产生这个结果:name: MMMMMM.
我的问题归结为:如何从Fortran返回一个字符串到C++?
鉴于以下熊猫数据框:
| a b
--+-----
0 | 1 A
1 | 2 A
2 | 3 A
3 | 4 A
4 | 1 B
5 | 2 B
6 | 3 B
7 | 1 C
8 | 3 C
9 | 4 C
Run Code Online (Sandbox Code Playgroud)
如果你按列分组,b我想执行一个操作,只保留它们有a共同列的行。结果将是以下数据框:
| a b
--+-----
0 | 1 A
2 | 3 A
4 | 1 B
6 | 3 B
7 | 1 C
8 | 3 C
Run Code Online (Sandbox Code Playgroud)
是否有一些内置方法可以做到这一点?
请看下面的图片。
第一张图片显示了当前的问题;在intellij中使用markdown插件编写markdown文件时,换行会在下一行的开头添加一个空格,并且它会针对每个新行进行累加。下面三张图片显示了我认为的相关设置。
知道为什么要添加这些额外的空间吗?是bug还是我的设置有问题?总是要返回并删除多余的空格,这真的很烦人。
所以在我的评论员要求我终于找到了一个再现我的错误的MCVE.所以一般的设置是Java使用JNI来调用dll,并且dll抓住正在运行的JVM并存储一个指向JNIEnv的指针,它用于调用java类中的方法(从c ++调用的java类)不一定是原始的调用java对象,这就是输入jobject不用于回调的原因).在我进一步解释之前,让我发布所有代码:
JniTest.java
package jnitest;
public class JniTestJava {
public static void main(String[] args) {
try {
System.load("<path-to-dll>");
} catch (Throwable e) {
e.printStackTrace();
}
DllFunctions dllFunctions = new DllFunctions();
dllFunctions.setup();
dllFunctions.singleIntFunctionCall();
dllFunctions.doubleIntFunctionCall();
dllFunctions.singleStringFunctionCall();
dllFunctions.doubleStringFunctionCall();
}
public void javaStringFunction(String input){
System.out.println(input);
}
public void javaIntFunction(int input){
System.out.println(input);
}
}
Run Code Online (Sandbox Code Playgroud)
DllFunctions.java
package jnitest;
public class DllFunctions{
public native void singleIntFunctionCall();
public native void doubleIntFunctionCall();
public native void singleStringFunctionCall();
public native void doubleStringFunctionCall();
public native void setup();
}
Run Code Online (Sandbox Code Playgroud)
JniTestCpp.h
#include <jni.h>
#ifndef …Run Code Online (Sandbox Code Playgroud) 所以我的设置是我有一个由我开发的.dll(A.dll),它在原始应用程序中从外部进程调用,它基本上只是一个.exe文件,我没有源代码(B) .exe).A.dll的目的是与.jar文件进行通信,该文件也是由我开发的(C.jar).所以在应用程序中,"通信流程"如下所示
B.exe - > A.dll - > (通过JNI) - > C.jar
现在,我想要做的就是添加调用之间会A.DLL和C.jar 作为我的测试套件为开发环境的一部分C.jar.到目前为止,我已经创建了另一个.dll(D.dll),它反映了A.dll中的所有函数,但是使用了JNIEXPORT,只是直接调用A.dll中的相应函数.所以这种情况下的"沟通流程"如下:
C.jar开发框架中的单元测试 - >(通过JNI) - > D.dll - > A.dll - >(通过JNI) - > C.jar
在这一点上,一个非常简单的函数调用只是在C.jar中打印出来的东西,它通过整个链条起作用; 从单元测试调用到C.jar的所有方式.然而,当我在A.dll中调用函数时会出现问题,该函数使用CreateJavaVM()创建一个新的JVM ,这会产生以下错误:
初始化VM时出错无法加载本机库:找不到指定的过程
所以基本上我想知道它是否真的可以这样做,或者只是在同一进程中已经有一个正在运行的JVM时调用CreateJavaVM()根本不可能?我知道你不能在同一个进程中多次调用CreateJavaVM(),但是在这种情况下它只被调用一次但是过程中已经存在一个JVM - 你甚至可以在同一个进程中运行多个JVM吗?
解:
感谢@ apangin的回答,下面的代码片段解决了我的问题:
jsize nVMs = 0;
JavaVM** buffer;
jni_GetCreatedJavaVMs = (GetCreatedJavaVMs) …Run Code Online (Sandbox Code Playgroud)