thảo luận [Python] Thread dành cho anh em Python

Python:
from typing import List


class A:
    field_a: int
    field_b: str


class B:
    data: List[A]

    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)


data = {
    "data": [
        {
            "field_a": 1,
            "field_b": "a"
        }
    ]
}

b = B(**data)
print(b.data[0].field_a)


Anh em cho mình hỏi chút, khi mình run đoạn code trên thì báo lỗi:

Code:
Traceback (most recent call last):
  File "/test.py", line 27, in <module>
    print(b.data[0].field_a)
          ^^^^^^^^^^^^^^^^^
AttributeError: 'dict' object has no attribute 'field_a'

Mình đang tập tành học thêm mấy kiến thức basic OOP trong python, mặc dù IDE có hint là có thể access theo dạng object được. Tuy nhiên mình thử lại lỗi

print(b.data[0]['field_a'])

Vì b.data[0] nó là dict mà.
 
Python:
from typing import List


class A:
    field_a: int
    field_b: str


class B:
    data: List[A]

    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)


data = {
    "data": [
        {
            "field_a": 1,
            "field_b": "a"
        }
    ]
}

b = B(**data)
print(b.data[0].field_a)


Anh em cho mình hỏi chút, khi mình run đoạn code trên thì báo lỗi:

Code:
Traceback (most recent call last):
  File "/test.py", line 27, in <module>
    print(b.data[0].field_a)
          ^^^^^^^^^^^^^^^^^
AttributeError: 'dict' object has no attribute 'field_a'

Mình đang tập tành học thêm mấy kiến thức basic OOP trong python, mặc dù IDE có hint là có thể access theo dạng object được. Tuy nhiên mình thử lại lỗi
Bác học trang nào vậy cho e xin link ôn lại với
 
Python:
from typing import List


class A:
    field_a: int
    field_b: str


class B:
    data: List[A]

    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)


data = {
    "data": [
        {
            "field_a": 1,
            "field_b": "a"
        }
    ]
}

b = B(**data)
print(b.data[0].field_a)


Anh em cho mình hỏi chút, khi mình run đoạn code trên thì báo lỗi:

Code:
Traceback (most recent call last):
  File "/test.py", line 27, in <module>
    print(b.data[0].field_a)
          ^^^^^^^^^^^^^^^^^
AttributeError: 'dict' object has no attribute 'field_a'

Mình đang tập tành học thêm mấy kiến thức basic OOP trong python, mặc dù IDE có hint là có thể access theo dạng object được. Tuy nhiên mình thử lại lỗi
viết như này giống code C, python đâu cần khai báo kiểu dữ liệu
print(b.data[0].field_a) sai vì field_a đang ở trong cái dict, mà ở trong dict thì phải dùng " "
-> b.data[0]["field_a"]
 
print(b.data[0]['field_a'])

Vì b.data[0] nó là dict mà.
Mình có define field data có type là class A đó bạn, vì 1 số bên ngôn ngữ khác khi bạn define class như vậy nó sẽ tự động map thành object A. Mình không rõ bên Python có hoạt động tương tự như vậy ko
 

Attachments

  • Screenshot 2023-05-16 at 12.47.35.png
    Screenshot 2023-05-16 at 12.47.35.png
    15.4 KB · Views: 27
Mình có define field data có type là class A đó bạn, vì 1 số bên ngôn ngữ khác khi bạn define class như vậy nó sẽ tự động map thành object
Bác quen ngôn ngữ khác nên khi viết Python cũng bị lối mòn theo đó. :)
 
Mình có define field data có type là class A đó bạn, vì 1 số bên ngôn ngữ khác khi bạn define class như vậy nó sẽ tự động map thành object A. Mình không rõ bên Python có hoạt động tương tự như vậy ko
a : int, b : str, c : list là type hints, chỉ là các gợi ý rằng các biến nên ở dạng đó không có nghĩa biến không nhận dạng khác. cái này giúp ích khi lập trình và đọc, debug code thôi bác
 
Cho e hỏi là trong python thì những trường hợp nào mình nên sử dụng class nhỉ ? Bình thường e code chỉ sử dụng hàm thôi thấy vẫn ổn, đây có phải thói quen xấu không?
 
Vì python code nó dễ, nhiều tools, ra sản phẩm nhanh
Nói là chậm, nhưng cũng ko quá chậm đâu,
Build product đến khi có doanh thu ổn rồi thì migrate sang go, java cũng chưa muộn.

Run thử code sau trên python và java
Python:
i = 0
while i < 1000000000:
    i += 1
-> 49.69087219238281 s
Java:
int i = 0;
while (i < 1000000000) {
    i++;
}
-> 0.001312295 s

h1kRuMc.jpg
 
Run thử code sau trên python và java
Python:
i = 0
while i < 1000000000:
    i += 1
-> 49.69087219238281 s
Java:
int i = 0;
while (i < 1000000000) {
    i++;
}
-> 0.001312295 s

h1kRuMc.jpg
sao python chậm dữ vậy trước giờ thấy python, trước giờ thấy python nhiều lib lúc làm tiện hơn tưởng ngon
 
sao python chậm dữ vậy trước giờ thấy python, trước giờ thấy python nhiều lib lúc làm tiện hơn tưởng ngon
Cũng tuỳ trường hợp chứ không phải lúc nào nó cũng chậm thế, nhưng cơ bản thì so với các ngôn ngữ biên dịch thì là chậm.
Cái gì chậm quá thì tìm cách khác thôi. :censored:
 
sao python chậm dữ vậy trước giờ thấy python, trước giờ thấy python nhiều lib lúc làm tiện hơn tưởng ngon
Python thì chậm thật nhưng đổi lại thì tốc độ phát triển tính năng sẽ nhanh. Với lại thư viện của nó nhiều cái thực ra viết bằng C nên bạn k cần lo về tốc độ nhé.
 
Cho e hỏi là trong python thì những trường hợp nào mình nên sử dụng class nhỉ ? Bình thường e code chỉ sử dụng hàm thôi thấy vẫn ổn, đây có phải thói quen xấu không?
class và func , chả liên quan gì nhau cả
Câu hỏi nên hỏi đúng là có nên mix data và behavior vào trong 1 class hay tách biệt , trong python là Protocol vs ABC.
 
Em đang làm 1 cái hàm download file mà gặp cái url này không biết nên xử lý ntn, bình thường mọi khi gọi response = requests.get(url) là nó sẽ trả về file giống như mình tải file trên trình duyệt, đôi lúc bị chặn thì thêm 1 vài params vào trong hàm get đó là ok mà với cái url này em dùng trình duyệt vẫn tải về bt mà dùng requests để tải thì nó lại trả ra 1 trang html, status code vẫn 200 nhưng k có nội dung gì cả, các thím nhiều kinh nghiệm cho em biết tại sao với ạ :burn_joss_stick:
 
Em đang làm 1 cái hàm download file mà gặp cái url này không biết nên xử lý ntn, bình thường mọi khi gọi response = requests.get(url) là nó sẽ trả về file giống như mình tải file trên trình duyệt, đôi lúc bị chặn thì thêm 1 vài params vào trong hàm get đó là ok mà với cái url này em dùng trình duyệt vẫn tải về bt mà dùng requests để tải thì nó lại trả ra 1 trang html, status code vẫn 200 nhưng k có nội dung gì cả, các thím nhiều kinh nghiệm cho em biết tại sao với ạ :burn_joss_stick:
nhiều khả năng lắm thím, mình thì nghĩ có thể có 2 nguyên nhân:
- Thiếu headers kiểu browser nên web nó chặn, có thể thêm headers để giả làm browser như sau
Python:
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
response = requests.get(url, headers=headers)
- Web có dùng JS để xử lý download --> requests nó ko hỗ trợ chạy JS, thím có thể dùng thử selenium
 
nhiều khả năng lắm thím, mình thì nghĩ có thể có 2 nguyên nhân:
- Thiếu headers kiểu browser nên web nó chặn, có thể thêm headers để giả làm browser như sau
Python:
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
response = requests.get(url, headers=headers)
- Web có dùng JS để xử lý download --> requests nó ko hỗ trợ chạy JS, thím có thể dùng thử selenium
Vụ dùng js thì em nghĩ là không đâu vì khi nhập url vào trình duyệt là nó tự động hỏi save file ở đâu mà, làm gì có chỗ nào để js chạy đâu.
Với cả selenium chạy nhiều lúc bị treo, dự án này em làm ban đầu cũng là dùng selenium nhưng lỗi nhiều quá mới dùng requests hết ạ.
Em cũng nghiêng về khả năng headers bị thiếu nhưng mà em có thử so sánh headers của thằng này và những url trước đây từng xử lý thì không thấy nó khác gì nhau cả, thế mới khoai.
 
Vụ dùng js thì em nghĩ là không đâu vì khi nhập url vào trình duyệt là nó tự động hỏi save file ở đâu mà, làm gì có chỗ nào để js chạy đâu.
Với cả selenium chạy nhiều lúc bị treo, dự án này em làm ban đầu cũng là dùng selenium nhưng lỗi nhiều quá mới dùng requests hết ạ.
Em cũng nghiêng về khả năng headers bị thiếu nhưng mà em có thử so sánh headers của thằng này và những url trước đây từng xử lý thì không thấy nó khác gì nhau cả, thế mới khoai.
có gọi mà thím, thử curl là biết. Mình đoán nó là cái script này
up script lỗi nên thay bằng ảnh z
1685431591015.png
 
Back
Top