在数据类中解压缩kwarg

问题描述

创建数据类对象时,我可以使用kwargs,而不会出现问题:

@dataclass()
class Data:
    name: str =         'Unnamed'
    additional: int =   None
    things: int =       None

dic = {'additional': 123,'things': 456}
res = Data(name='Somename',**dic)

Output: Data(name='Somename',additional=123,things=456)

但是,当它们不属于调用参数时,我想将kwargs拆包到数据类中:

@dataclass()
class Data:
    name: str =         'Unnamed'
    additional: int =   None
    things: int =       None

    def __post_init__(self):
        self(**dic) #unpack kwargs to fields

dic = {'additional': 123,'things': 456}
res = Data(name='Somename')

解决方法

import java.util.Scanner; public class Main { public static void main(String[] args) { // Create scanner object and set scanner variables Scanner inp = new Scanner(System.in); System.out.println("Press any key to start"); String key = inp.nextLine(); System.out.println("\nEnter the amount of each item"); System.out.println("Upto 5 inputs are allowed!\n"); int counter = 0; int index = 0; int index2 = 0; Double[] numbers = new Double[5]; Double[] numbers2 = new Double[5]; boolean go = true; while (go) { String value = inp.nextLine(); value = value.toLowerCase(); // Set the index value to "h" or "H" int indexOfh = value.indexOf('h'); boolean containsh = indexOfh == 0 || indexOfh == (value.length() - 1); if (containsh) { // Validate h at beginning or end numbers[index] = Double.parseDouble(value.replace("h","")); index++; System.out.println("HST will be taken account for this value"); } else { numbers2[index2] = Double.parseDouble(value); // changed here index2++; //added this line } counter++; if (counter == 5) { go = false; } } System.out.println("\nHST Values:"); for (int i = 0; i < index; i++) { // changed here // no need to do null check now System.out.println(numbers[i]); } System.out.println("\nNon-HST Values:"); for (int x = 0; x < index2; x++) { // changed here // no need to do null check now System.out.println(numbers2[x]); } } } 可以显式定义dataclass方法。

documentation指出:

__init__()的参数为:

dataclass():如果为true(默认设置),则会生成一个init方法。

如果该类已经定义了__init__(),则将忽略此参数。

因此,您可以定义标准的__init__()方法来处理__init__()

kwargs
,

最后我得到了一个略有不同的解决方案,该解决方案实现了预期的目标:

dic = {'Somename': 123}

@dataclass()
class Data:
    name: str =         'Unnamed'
    additional: int =   None
    things: int =       None
    arg: int =          None

    def __post_init__(self):
        self.arg = dic.get(self.name,None)

res = Data(name='Somename')

Data(name='Somename',additional=None,things=None,arg=123)