Skip to content
Trang chủ » Converting Python Dataclass To Dictionary: A Comprehensive Guide

Converting Python Dataclass To Dictionary: A Comprehensive Guide

THE BIGGEST DICTIONARY PROBLEM IN PYTHON. FIXING IT WITH DATACLASSES

Python Dataclass To Dictionary

Python Dataclass to Dictionary: Simplifying Data Manipulation

As data manipulation plays a vital role across various domains of software development, Python provides a powerful tool called dataclasses to streamline this process. Python dataclasses offer an easy way to define classes with automatically generated special methods and type hints. One such operation is converting a dataclass to a dictionary, which can be incredibly useful when working with structured data. In this article, we will explore the concept of Python dataclasses, their purpose, benefits, and how to convert them to dictionaries. We will also cover some advanced considerations and limitations associated with this conversion process.

What is a Python Dataclass?

Introduced in Python 3.7, the dataclasses module provides a decorator that automatically generates special methods, such as `__init__`, `__repr__`, `__eq__`, `__hash__`, and `__str__`, based on the class definition. It also enhances readability by automatically adding a type hinting mechanism. The primary purpose of dataclasses is to simplify and streamline the process of defining classes that hold data.

Benefits of Using Dataclasses in Python

Dataclasses offer several benefits over traditional class definitions when dealing with data manipulation:

1. Concise Syntax: The use of dataclasses reduces boilerplate code, eliminating the need to write repetitive special methods such as `__init__`, `__repr__`, and `__eq__`.

2. Readability and Maintainability: By automatically generating special methods and adding type hints, dataclasses enhance code readability, making it easier to understand and maintain.

3. Built-in Type Validation: Dataclasses automatically perform type validation based on the defined type hints, ensuring data integrity.

4. Default Values: Dataclass fields can have default values, eliminating the need for manual default initialization.

5. Inheritance: Dataclasses can be inherited, inheriting all the benefits of the parent class, including the generated special methods and type hints.

Converting a Python Dataclass to a Dictionary

There are multiple methods to convert a dataclass object to a dictionary.

1. Using the `asdict()` Function in the `dataclasses` Module:

The `asdict()` function provided by the dataclasses module allows for direct conversion of dataclass objects to dictionaries. It recursively converts nested dataclass objects within the main dataclass.

Here’s an example:

“`python
from dataclasses import dataclass, asdict

@dataclass
class Person:
name: str
age: int

person = Person(name=”John”, age=25)
person_dict = asdict(person)

print(person_dict) # Output: {‘name’: ‘John’, ‘age’: 25}
“`

2. Manual Conversion:

In cases where customization is required or when working with complex structures, a manual conversion can be performed. This involves iterating over the dataclass fields and converting them individually to a dictionary.

“`python
from dataclasses import fields

person_dict = {}

for field in fields(person):
person_dict[field.name] = getattr(person, field.name)

print(person_dict) # Output: {‘name’: ‘John’, ‘age’: 25}
“`

Handling Nested Dataclasses and Custom Types

When dealing with nested dataclasses, the conversion process remains the same as mentioned above. The `asdict()` function takes care of converting nested dataclasses to dictionaries recursively.

However, when working with custom types within a dataclass, special considerations may be required. For instance, if a dataclass contains a field of type `datetime.datetime`, it needs to be converted to an appropriate dictionary representation. This can be done by manually converting the datetime object to a string or any other suitable format before converting the dataclass to a dictionary.

Preserving Dataclass Field Types in the Dictionary

By default, when converting a dataclass to a dictionary, the resulting dictionary will only contain the values without any information about their original data types. To preserve the original dataclass field types, a common approach is to include type hints in the generated dictionary.

Here’s an example:

“`python
from typing import Dict
from dataclasses import asdict, dataclass

@dataclass
class Person:
name: str
age: int

def to_dict(self) -> Dict[str, object]:
person_dict = asdict(self)
field_types = {
field.name: field.type.__name__
for field in fields(self)
}
person_dict[“__types__”] = field_types
return person_dict

person = Person(name=”John”, age=25)
person_dict = person.to_dict()

print(person_dict)
# Output: {‘name’: ‘John’, ‘age’: 25, ‘__types__’: {‘name’: ‘str’, ‘age’: ‘int’}}
“`

Customizing the Dictionary Conversion Process

To customize the conversion process and modify the behavior of dataclass fields during conversion, you can implement the `__dict__()` special method. This method allows you to control the dictionary representation of the dataclass object.

Here’s an example:

“`python
from dataclasses import dataclass

@dataclass
class Person:
name: str
age: int

def __dict__(self):
return {“name”: self.name.upper(), “age”: self.age}

person = Person(name=”John”, age=25)
person_dict = person.__dict__()

print(person_dict) # Output: {‘name’: ‘JOHN’, ‘age’: 25}
“`

Advanced Considerations and Limitations

When converting dataclasses to dictionaries, there are advanced considerations and limitations to keep in mind:

1. Cyclic References: If dataclass objects contain attributes that create cyclic references, such as referencing each other, special handling may be required to prevent infinite recursion during conversion.

2. Performance Considerations: Converting large dataclass objects to dictionaries can have performance implications. It is recommended to benchmark and analyze the conversion process if dealing with substantial amounts of data.

In conclusion, Python dataclasses provide a concise and efficient way to define classes for data manipulation. The ease of converting dataclass objects to dictionaries allows for seamless integration with other parts of the codebase. By understanding the concepts and techniques involved in Python dataclass to dictionary conversion, programmers can simplify data manipulation and improve the overall efficiency of their code.

The Biggest Dictionary Problem In Python. Fixing It With Dataclasses

How To Convert Data To Dictionary In Python?

How to Convert Data to Dictionary in Python

In Python, a dictionary is an unordered collection of key-value pairs, where each key is unique. Dictionaries are incredibly useful for storing and retrieving data efficiently. However, there are times when you may need to convert data from other formats into a dictionary. This article will guide you on how to convert various data types to a dictionary in Python.

1. Converting Lists to Dictionary
To convert a list to a dictionary, you need to have a list of key-value pairs. The keys can be any hashable data type, while the values can be of any type. Here’s an example:

“`
my_list = [(“apple”, 2), (“banana”, 3), (“orange”, 1)]
my_dict = dict(my_list)
print(my_dict)
“`

Output:
“`
{‘apple’: 2, ‘banana’: 3, ‘orange’: 1}
“`

In this example, we have a list of tuples, where each tuple contains a key-value pair. Using the `dict()` function, we pass the list as an argument, and it converts the list to a dictionary. The output is a dictionary with keys and values from the original list.

2. Converting Tuples to Dictionary
If your data is in the form of tuples, you can also convert them to a dictionary using similar techniques as with lists. Here’s an example:

“`
my_tuple = ((“name”, “John”), (“age”, 30), (“city”, “New York”))
my_dict = dict(my_tuple)
print(my_dict)
“`

Output:
“`
{‘name’: ‘John’, ‘age’: 30, ‘city’: ‘New York’}
“`

In this example, we have a tuple of tuples. When we pass the tuple to the `dict()` function, it converts the tuple into a dictionary.

3. Converting Two Lists to Dictionary
Sometimes you may have two separate lists, one containing keys and the other containing values. To convert these lists into a dictionary, you can use the `zip()` function to combine them. Here’s an example:

“`
keys = [“Name”, “Age”, “City”]
values = [“John”, 30, “New York”]
my_dict = dict(zip(keys, values))
print(my_dict)
“`

Output:
“`
{‘Name’: ‘John’, ‘Age’: 30, ‘City’: ‘New York’}
“`

In this example, we have two separate lists containing keys and values. Using `zip()`, we combine the elements from both lists and create a dictionary. The output is a dictionary with keys and values from the original lists.

4. Converting CSV to Dictionary
When working with data stored in CSV (Comma Separated Values) files, you can leverage the `csv` module in Python to convert the data into a dictionary. Here’s an example:

“`
import csv

with open(‘data.csv’, ‘r’) as file:
reader = csv.reader(file)
my_dict = dict(reader)

print(my_dict)
“`

Output:
“`
{‘name’: ‘John’, ‘age’: ’30’, ‘city’: ‘New York’}
“`

In this example, we open a CSV file called ‘data.csv’ and use the `csv.reader()` function to read the file. We then convert the reader object into a dictionary using the `dict()` function. The output is a dictionary with keys and values from the CSV file.

FAQs:

Q1. Can a dictionary have duplicate keys?
No, a dictionary cannot have duplicate keys. If you try to assign multiple values to the same key, the latest value will overwrite the previous one.

Q2. Can a dictionary have multiple values for the same key?
No, a dictionary can only have one value associated with a given key. However, that value can be a list or another data structure that holds multiple values.

Q3. How can I convert a string of key-value pairs to a dictionary?
If your data is in the form of a string with key-value pairs, you can use the `eval()` function to transform it into a dictionary. However, exercise caution when using `eval()` as it can execute arbitrary code from the string.

Q4. How can I convert a dictionary to a list of tuples?
To convert a dictionary to a list of tuples, you can use the `items()` method of the dictionary. This method returns a list of tuples, where each tuple contains a key-value pair from the dictionary.

Q5. Can a dictionary contain heterogeneous data types?
Yes, a dictionary in Python can contain values of different data types. It is a flexible data structure that can store various types of information.

In conclusion, knowing how to convert data to a dictionary in Python is a valuable skill for manipulating and organizing data efficiently. Whether you’re converting lists, tuples, or CSV files, the techniques outlined in this article will allow you to seamlessly transform your data into dictionaries. Remember to choose the appropriate method based on the data type and structure you have.

How To Convert String Class To Dictionary In Python?

How to Convert String Class to Dictionary in Python

Python is a versatile programming language that provides different data structures to handle and manipulate data efficiently. One commonly used data structure is a dictionary, which allows you to store and access data using key-value pairs. Converting a string class to a dictionary in Python can be a useful skill to have when working with data in different formats. In this article, we will explore different methods to convert a string class to a dictionary and understand their implementation in detail.

Method 1: Using the eval() Function
The eval() function in Python evaluates a given expression and returns the result. This function can be used to convert a string class to a dictionary by passing the string as the argument and using the eval() function to evaluate the string.

“`python
string = ‘{“name”: “John”, “age”: 30, “city”: “New York”}’
dictionary = eval(string)
print(dictionary)
“`

In this method, we define a string that represents a dictionary. We then pass this string to the eval() function and assign the result to a variable. Finally, we print the dictionary to verify the conversion.

Method 2: Using the json.loads() Function
The json module in Python provides a loads() function that can be used to convert a string class to a dictionary. This method is particularly useful when working with JSON data.

“`python
import json

string = ‘{“name”: “John”, “age”: 30, “city”: “New York”}’
dictionary = json.loads(string)
print(dictionary)
“`

Here, we import the json module and use the loads() function to parse the string and convert it into a dictionary. The resulting dictionary is then printed for verification.

Method 3: Using the ast.literal_eval() Function
The ast module in Python provides a literal_eval() function that can be used to safely evaluate and convert a string class to a dictionary.

“`python
import ast

string = ‘{“name”: “John”, “age”: 30, “city”: “New York”}’
dictionary = ast.literal_eval(string)
print(dictionary)
“`

To use this method, we import the ast module and then apply the literal_eval() function to the string. The result is assigned to the dictionary variable and printed to confirm the conversion.

Method 4: Using a Custom Function
If you prefer to implement your own custom function to convert a string class to a dictionary, you can use the split() function and list comprehension in Python.

“`python
def convert_string_to_dict(string):
temp = string.split(“,”)
dictionary = {item.split(“:”)[0].strip(): item.split(“:”)[1].strip() for item in temp}
return dictionary

string = ‘{“name”: “John”, “age”: 30, “city”: “New York”}’
dictionary = convert_string_to_dict(string)
print(dictionary)
“`

In this method, we define a custom function called convert_string_to_dict(). Inside the function, we split the string using commas to obtain individual key-value pairs. We then split each pair using colons and store them as key-value pairs in a dictionary using list comprehension. Finally, the dictionary is returned and printed.

FAQs

Q1. Is it possible to convert a string class to a nested dictionary?
A1. Yes, it is possible to convert a string class to a nested dictionary in Python. You can use any of the methods mentioned above to convert the string into a dictionary, and then manually manipulate the dictionary to create nested structures.

Q2. What if the string class contains invalid characters or syntax errors?
A2. If the string contains invalid characters or syntax errors, some of the methods mentioned above may raise exceptions. It is important to validate the string before attempting the conversion. The json.loads() method is particularly useful in handling JSON data and will raise a ValueError if the string is not in valid JSON format.

Q3. Are there any limitations or constraints while converting a string class to a dictionary?
A3. While converting a string class to a dictionary, you should ensure that the string is formatted correctly and follows the syntax rules of either JSON or Python dictionaries. Additionally, the resulting dictionary may not necessarily maintain the original order of key-value pairs, as dictionaries are unordered data structures in Python.

Conclusion
Converting a string class to a dictionary in Python can be achieved using various methods, such as using the eval() function, json.loads() function, ast.literal_eval() function, or creating a custom function. Each method offers its own advantages and may be suitable for different scenarios. By understanding these techniques, you can efficiently handle and manipulate data in different formats within your Python programs.

Keywords searched by users: python dataclass to dictionary Python dataclass to dict, Pydantic dataclass, Python dataclass optional, __Dict__ Python, Dataclass Python, Dict to dataclass, Convert object to dict Python, Dict to JSON python

Categories: Top 46 Python Dataclass To Dictionary

See more here: nhanvietluanvan.com

Python Dataclass To Dict

Python Dataclasses: Converting Objects to Dictionaries

Python, being a versatile and powerful programming language, offers numerous built-in features that enhance developer productivity and improve code readability. One such feature is the dataclass decorator, introduced in Python 3.7, which simplifies the creation of classes that are primarily used to store data.

In this article, we will explore the concept of dataclasses and delve into the process of converting dataclass objects to dictionaries. Additionally, we will address some frequently asked questions to provide a comprehensive understanding of this topic.

Understanding Dataclasses:
Dataclasses provide a concise and intuitive way to define classes in Python that are predominantly used to store data. With just a few lines of code, we can automatically generate common methods like __init__, __repr__, and __eq__.

To create a dataclass, we start by importing the dataclass decorator from the built-in “dataclasses” module. We then define our class, decorate it with @dataclass, and optionally specify any desired attributes. Let’s consider the following example:

“`python
from dataclasses import dataclass

@dataclass
class Person:
name: str
age: int
job: str
“`
In the above code snippet, we have created a simple Person class using the dataclass decorator. It defines three attributes: name, age, and job, all of which have their respective types.

Converting Dataclass Objects to Dictionaries:
Converting dataclass objects to dictionaries can be extremely useful in various scenarios, such as storing data in a database, serializing objects for network communication, or simply for debugging purposes. Fortunately, Python provides an efficient and straightforward way to achieve this conversion.

To convert a dataclass object to a dictionary, we can utilize the built-in asdict() function from the “dataclasses” module. This function takes an instance of a dataclass as an argument and returns a dictionary representation of the object. Let’s see an example:

“`python
from dataclasses import dataclass, asdict

@dataclass
class Person:
name: str
age: int
job: str

person = Person(‘John Doe’, 30, ‘Engineer’)
person_dict = asdict(person)
print(person_dict)
“`
In the above code, we create an instance of the Person class and assign it to the ‘person’ variable. We then use the asdict() function to convert the object to a dictionary and store it in the ‘person_dict’ variable. Finally, we print the resulting dictionary, which contains the attributes and their corresponding values.

FAQs:
Q: Can I exclude specific attributes from the generated dictionary?
A: Yes, you can. The asdict() function allows you to selectively exclude attributes from the generated dictionary by passing them as arguments. For example, asdict(person, exclude=[‘job’]) will exclude the ‘job’ attribute from the dictionary.

Q: Can I customize the dictionary keys?
A: Absolutely! If you wish to use different keys in the dictionary for specific attributes, you can define an __init__ method in the dataclass and manually map the attribute names to the desired keys.

Q: Can I convert nested dataclass objects to dictionaries?
A: Yes, you can convert nested dataclass objects to dictionaries using the asdict() function recursively. It will automatically handle the conversion for all nested objects.

Q: Is the order of attributes preserved in the generated dictionary?
A: By default, the order of attributes in the dictionary corresponds to the order in which they are defined in the dataclass. However, note that Python versions before 3.7 do not guarantee the preservation of attribute order.

Q: How can I convert a dictionary back to a dataclass object?
A: To convert a dictionary back to a dataclass object, you can utilize the built-in make_dataclass() function from the “dataclasses” module. It allows you to dynamically create a dataclass using the dictionary’s keys as attribute names and values as their initial values.

In conclusion, Python dataclasses provide a concise and efficient way to define classes primarily used for data storage. With the help of the asdict() function, converting dataclass objects to dictionaries becomes a breeze. This ability opens up numerous possibilities, such as easy serialization and database integration. Remember to explore the various options provided by dataclasses to customize your conversions according to your specific needs.

Pydantic Dataclass

Pydantic Dataclass: Simplifying Python Data Validation and Parsing

In Python, working with data can sometimes become a challenge, especially when it involves complex data structures and validation tasks. Pydantic is a powerful library that offers a simple and efficient solution to handle these problems. One of its key features is the Pydantic dataclass, which allows developers to define and work with data models effortlessly. In this article, we will explore the Pydantic dataclass in-depth, covering its functionality, benefits, and how it simplifies data validation and parsing in Python.

What is Pydantic?
Pydantic is a Python library that provides runtime type checking and validation of data structures using Python 3.7’s new data classes. It offers an easy-to-use and expressive way to define and validate data models. Pydantic can be especially useful when dealing with APIs, settings management, and data analysis.

Introducing Pydantic Dataclass:
In Python 3.7, data classes were introduced as a simple and concise way to define classes with attributes that hold data. By combining data classes with Pydantic, developers have an even more powerful tool to work with. A Pydantic dataclass is essentially a data class that incorporates validation and parsing capabilities.

Defining a Pydantic Dataclass:
To define a Pydantic dataclass, we can use Pydantic’s `BaseModel` as the parent class. A Pydantic dataclass can be defined using the `@pydantic.dataclass` decorator from the Pydantic module. Let’s take a look at an example:

“`
from pydantic import BaseModel

@pydantic.dataclass
class Person(BaseModel):
name: str
age: int
email: Optional[str] = None
“`

In this example, we define a simple data model for a Person. The attributes `name` and `age` are required fields, while `email` is an optional field, indicated by the `Optional` type hint.

Data Validation and Parsing:
Once we have defined our Pydantic dataclass, we can leverage its powerful validation and parsing capabilities. By default, Pydantic performs type validation on the defined attributes. If a value of the wrong type is provided, Pydantic raises a `ValidationError`, making it easy to catch and handle such errors.

Pydantic also supports other forms of validation, such as defining arbitrary validation functions or using field constraints, which allow us to define conditions for attribute values. This flexibility makes it possible to create complex validation logic with ease.

Parsing input data into our Pydantic dataclass is equally convenient. We can simply pass a dictionary representing the input data, and Pydantic will ensure type validation and parsing according to our model’s specifications.

Benefits of Pydantic Dataclass:
1. Easy to use: Pydantic dataclasses offer a clear and intuitive way to define data models, eliminating the complexity of manual validation and parsing.

2. Robust data validation: Pydantic provides reliable runtime type checking and validation, reducing the chances of runtime errors caused by incorrect data.

3. Flexible parsing: Pydantic automatically parses input data according to the defined data model, making it easier to work with external data sources such as APIs and databases.

4. Improved readability and maintainability: With Pydantic dataclasses, developers can write clean, concise, and self-documenting code, making it easier for others to understand and maintain.

5. Integration with Python ecosystem: Since Pydantic dataclasses utilize Python 3.7’s data class feature, they seamlessly integrate with other Python ecosystem tools and libraries.

FAQs about Pydantic Dataclass:

Q: Can I add methods to a Pydantic dataclass?
A: Yes, you can add methods to a Pydantic dataclass just like you would with any other Python class. However, keep in mind that Pydantic focuses on data validation and parsing, so adding methods unrelated to data processing might not align with its intended use.

Q: Can I nest Pydantic dataclasses?
A: Absolutely! Pydantic supports nesting dataclasses, which means you can define attributes of a Pydantic dataclass as another Pydantic dataclass. This allows for building complex data structures effortlessly.

Q: Can I use Pydantic dataclasses with Django or SQLAlchemy models?
A: Yes, Pydantic dataclasses can be used with Django or SQLAlchemy models. They can serve as convenient interfaces for validating and parsing data before storing it in a database or interacting with an ORM.

Q: Are there any performance implications of using Pydantic dataclasses?
A: While Pydantic does add a minor overhead due to type checking and validation, the performance impact is generally insignificant for most applications. However, it’s always a good practice to profile and measure performance when using any library extensively.

Conclusion:
The Pydantic dataclass is a powerful tool that simplifies data validation and parsing in Python. With its intuitive syntax and rich validation capabilities, developers can easily define and work with complex data models. Pydantic makes data processing and integration with external sources more reliable and efficient. By leveraging Pydantic dataclasses, developers can write cleaner code that is easier to understand and maintain, enhancing productivity in Python development.

Images related to the topic python dataclass to dictionary

THE BIGGEST DICTIONARY PROBLEM IN PYTHON. FIXING IT WITH DATACLASSES
THE BIGGEST DICTIONARY PROBLEM IN PYTHON. FIXING IT WITH DATACLASSES

Found 48 images related to python dataclass to dictionary theme

Learn Python Dictionary Data Structure – Part 3
Learn Python Dictionary Data Structure – Part 3
Class & Instance Dictionaries In Python | __Dict__ | Oop - Part 2 - Youtube
Class & Instance Dictionaries In Python | __Dict__ | Oop – Part 2 – Youtube
Understanding Python Dataclasses - Geeksforgeeks
Understanding Python Dataclasses – Geeksforgeeks
Python Class Instances From Dictionary Keys - Youtube
Python Class Instances From Dictionary Keys – Youtube
Python Dictionary - Create, Append, Update, Delete Examples
Python Dictionary – Create, Append, Update, Delete Examples
Python : Python Dataclass From A Nested Dict - Youtube
Python : Python Dataclass From A Nested Dict – Youtube
Are Dataclasses Better Than Dictionaries In Python - Youtube
Are Dataclasses Better Than Dictionaries In Python – Youtube
Abap Data Dictionary Interview Questions And Answer
Abap Data Dictionary Interview Questions And Answer
Python Json: Easily Work With Dictionaries, Files, And Custom Objects -  Codesolid.Com
Python Json: Easily Work With Dictionaries, Files, And Custom Objects – Codesolid.Com
Fabiorosado | Clean Code With Python Dataclasses | Fabio Rosado
Fabiorosado | Clean Code With Python Dataclasses | Fabio Rosado
Dictionary - Python 3 - Which One Is Faster For Accessing Data: Dataclasses  Or Dictionaries? - Stack Overflow
Dictionary – Python 3 – Which One Is Faster For Accessing Data: Dataclasses Or Dictionaries? – Stack Overflow
How Should/Can I Convert Loaded Json Data Into Python Objects? - Python  Help - Discussions On Python.Org
How Should/Can I Convert Loaded Json Data Into Python Objects? – Python Help – Discussions On Python.Org
Python Dictionary - Từ Điển Python Là Gì Và Những Thông Tin Bạn Nên Biết
Python Dictionary – Từ Điển Python Là Gì Và Những Thông Tin Bạn Nên Biết
How To Flatten A Dictionary In Python In 4 Different Ways
How To Flatten A Dictionary In Python In 4 Different Ways
Custom Python Dictionaries: Inheriting From Dict Vs Userdict – Real Python
Custom Python Dictionaries: Inheriting From Dict Vs Userdict – Real Python
Python Program To Convert Xml To Dictionary - Geeksforgeeks
Python Program To Convert Xml To Dictionary – Geeksforgeeks
Python Class Attributes: Examples Of Variables | Toptal®
Python Class Attributes: Examples Of Variables | Toptal®
Fabiorosado | Clean Code With Python Dataclasses | Fabio Rosado
Fabiorosado | Clean Code With Python Dataclasses | Fabio Rosado
Data Classes In Python 3.7+ (Guide) – Real Python
Data Classes In Python 3.7+ (Guide) – Real Python
Python - Editing A Dictionary With A Qtreeview - Stack Overflow
Python – Editing A Dictionary With A Qtreeview – Stack Overflow
Common Python Dictionary In Dynamo - Dynamo
Common Python Dictionary In Dynamo – Dynamo
Python Convert Json String To Dictionary Not List
Python Convert Json String To Dictionary Not List
Data Classes In Python 3.7+ (Guide) – Real Python
Data Classes In Python 3.7+ (Guide) – Real Python
Python Dictionary - Geeksforgeeks
Python Dictionary – Geeksforgeeks

Article link: python dataclass to dictionary.

Learn more about the topic python dataclass to dictionary.

See more: nhanvietluanvan.com/luat-hoc

Leave a Reply

Your email address will not be published. Required fields are marked *