Sau đó, nội dung của
subprocess.call[["ls", "-l"]]
8 [được truy cập thông qua lệnh "cat"] sẽ được chuyển đến tập lệnh python dưới dạng đầu vào tiêu chuẩn. Điều đó hoạt động tốt [mặc dù một cách thanh lịch hơn sẽ tốt hơn]. Nhưng bây giờ tôi phải chuyển một đối số khác, đơn giản là một từ sẽ được sử dụng làm truy vấn [và sau đó là hai từ]. Nhưng tôi không thể tìm ra cách để làm điều đó đúng cách, vì ống mèo sẽ gây ra lỗi. Và bạn không thể sử dụng tiêu chuẩn subprocess.call[["ls", "-l"]]
9 trong Python vì nó sẽ dẫn đến lỗi EOF [bạn không thể kết hợp stdin và subprocess.call[["ls", "-l"]]
9 trong Python]Giải pháp tốt nhất
Tôi khá chắc chắn rằng điểm đánh dấu stdin thực hiện thủ thuật
cat file.txt | python3.1 prearg - postarg
Cách thanh lịch hơn có lẽ là chuyển tệp. txt làm đối số, sau đó mở và đọc nó
Giải pháp liên quan
Python – Cách thực thi chương trình hoặc gọi lệnh hệ thống
Sử dụng mô-đun
>>> class ObjectCreator[object]:
.. pass
...
>>> my_object = ObjectCreator[]
>>> print[my_object]
1 trong thư viện chuẩnimport subprocess
subprocess.run[["ls", "-l"]]
Ưu điểm của over là linh hoạt hơn [bạn có thể lấy , , the , better , v.v. ]
Thậm chí đề xuất sử dụng
>>> class ObjectCreator[object]:
.. pass
...
>>> my_object = ObjectCreator[]
>>> print[my_object]
1 thay thếMô-đun
1 cung cấp các phương tiện mạnh mẽ hơn để tạo ra các quy trình mới và truy xuất kết quả của chúng; . Xem phần trong tài liệu>>> class ObjectCreator[object]: .. pass ... >>> my_object = ObjectCreator[] >>> print[my_object]
1 để biết một số công thức nấu ăn hữu ích>>> class ObjectCreator[object]: .. pass ... >>> my_object = ObjectCreator[] >>> print[my_object]
Trên Python 3. 4 trở về trước, sử dụng
>>> class ObjectCreator[object]:
.. pass
...
0 thay vì >>> class ObjectCreator[object]:
.. pass
...
1subprocess.call[["ls", "-l"]]
Python – Siêu dữ liệu trong Python là gì
Các lớp như các đối tượng
Trước khi hiểu về siêu dữ liệu, bạn cần nắm vững các lớp trong Python. Và Python có một ý tưởng rất đặc biệt về lớp là gì, mượn từ ngôn ngữ Smalltalk
Trong hầu hết các ngôn ngữ, các lớp chỉ là những đoạn mã mô tả cách tạo ra một đối tượng. Điều đó cũng đúng trong Python
>>> class ObjectCreator[object]:
.. pass
...
>>> my_object = ObjectCreator[]
>>> print[my_object]
Nhưng các lớp còn nhiều hơn thế trong Python. Lớp cũng là đối tượng
Vâng, đồ vật
Ngay khi bạn sử dụng từ khóa
>>> class ObjectCreator[object]:
.. pass
...
2, Python sẽ thực thi nó và tạo một đối tượng. Hướng dẫn>>> class ObjectCreator[object]:
.. pass
...
tạo trong bộ nhớ một đối tượng có tên
>>> class ObjectCreator[object]:
.. pass
...
3Bản thân đối tượng này [lớp] có khả năng tạo đối tượng [các thể hiện] và đây là lý do tại sao nó là một lớp
Tuy nhiên, nó vẫn là một đối tượng, và do đó
- bạn có thể gán nó cho một biến
- bạn có thể sao chép nó
- bạn có thể thêm các thuộc tính cho nó
- bạn có thể chuyển nó dưới dạng tham số chức năng
e. g
subprocess.call[["ls", "-l"]]
6Tạo lớp độngVì các lớp là các đối tượng, bạn có thể tạo chúng một cách nhanh chóng, giống như bất kỳ đối tượng nào
Đầu tiên, bạn có thể tạo một lớp trong một hàm bằng cách sử dụng
>>> class ObjectCreator[object]:
.. pass
...
2subprocess.call[["ls", "-l"]]
8Nhưng nó không năng động lắm, vì bạn vẫn phải tự viết cả lớp
Vì các lớp là các đối tượng, chúng phải được tạo bởi một cái gì đó
Khi bạn sử dụng từ khóa
>>> class ObjectCreator[object]:
.. pass
...
2, Python sẽ tự động tạo đối tượng này. Nhưng cũng giống như hầu hết mọi thứ trong Python, nó cung cấp cho bạn một cách để thực hiện thủ côngNhớ chức năng
>>> class ObjectCreator[object]:
.. pass
...
6? subprocess.call[["ls", "-l"]]
1Chà, có một khả năng hoàn toàn khác, nó cũng có thể tạo các lớp một cách nhanh chóng.
>>> class ObjectCreator[object]:
.. pass
...
6 có thể lấy mô tả của một lớp làm tham số và trả về một lớp[Tôi biết, thật ngớ ngẩn khi cùng một chức năng có thể có hai cách sử dụng hoàn toàn khác nhau tùy theo các tham số bạn truyền cho nó. Đó là sự cố do khả năng tương thích ngược trong Python]
>>> class ObjectCreator[object]:
.. pass
...
6 hoạt động theo cách nàysubprocess.call[["ls", "-l"]]
4Ở đâu
60. tên của lớpsubprocess.call[["ls", "-l"]]
61. bộ của lớp cha [để kế thừa, có thể để trống]subprocess.call[["ls", "-l"]]
62. từ điển chứa tên và giá trị thuộc tínhsubprocess.call[["ls", "-l"]]
e. g
cat file.txt | python3.1 prearg - postarg
0có thể được tạo thủ công theo cách này
cat file.txt | python3.1 prearg - postarg
1Bạn sẽ nhận thấy rằng chúng tôi sử dụng
subprocess.call[["ls", "-l"]]
63 làm tên của lớp và làm biến để giữ tham chiếu lớp. Chúng có thể khác nhau, nhưng không có lý do gì để phức tạp hóa mọi thứ>>> class ObjectCreator[object]:
.. pass
...
6 chấp nhận một từ điển để định nghĩa các thuộc tính của lớp. Cho nêncat file.txt | python3.1 prearg - postarg
2Có thể được dịch sang
cat file.txt | python3.1 prearg - postarg
3Và được sử dụng như một lớp bình thường
cat file.txt | python3.1 prearg - postarg
4Và tất nhiên, bạn có thể kế thừa từ nó, vì vậy
cat file.txt | python3.1 prearg - postarg
5sẽ là
cat file.txt | python3.1 prearg - postarg
6Cuối cùng, bạn sẽ muốn thêm các phương thức vào lớp của mình. Chỉ cần xác định một hàm có chữ ký phù hợp và gán nó làm thuộc tính
cat file.txt | python3.1 prearg - postarg
7Và bạn có thể thêm nhiều phương thức hơn nữa sau khi bạn tự động tạo lớp, giống như thêm các phương thức vào một đối tượng lớp được tạo bình thường
cat file.txt | python3.1 prearg - postarg
8Bạn thấy chúng ta đang đi đâu. trong Python, các lớp là các đối tượng và bạn có thể tạo một lớp nhanh chóng, linh hoạt
Đây là những gì Python làm khi bạn sử dụng từ khóa
>>> class ObjectCreator[object]:
.. pass
...
2 và nó làm như vậy bằng cách sử dụng siêu dữ liệuSiêu dữ liệu là gì [cuối cùng]Siêu dữ liệu là 'công cụ' tạo ra các lớp
Bạn định nghĩa các lớp để tạo các đối tượng, phải không?
Nhưng chúng tôi đã học được rằng các lớp Python là các đối tượng
Chà, siêu dữ liệu là thứ tạo ra các đối tượng này. Chúng là các lớp của các lớp, bạn có thể hình dung chúng theo cách này
cat file.txt | python3.1 prearg - postarg
9Bạn đã thấy rằng
>>> class ObjectCreator[object]:
.. pass
...
6 cho phép bạn làm điều gì đó như thế nàyimport subprocess
subprocess.run[["ls", "-l"]]
0Đó là bởi vì hàm
>>> class ObjectCreator[object]:
.. pass
...
6 trên thực tế là một siêu dữ liệu. >>> class ObjectCreator[object]:
.. pass
...
6 là siêu dữ liệu Python sử dụng để tạo tất cả các lớp đằng sau hậu trườngBây giờ bạn tự hỏi "tại sao nó lại được viết bằng chữ thường mà không phải là
subprocess.call[["ls", "-l"]]
69?"Chà, tôi đoán đó là vấn đề nhất quán với
subprocess.call[["ls", "-l"]]
80, lớp tạo đối tượng chuỗi và subprocess.call[["ls", "-l"]]
81 lớp tạo đối tượng số nguyên. >>> class ObjectCreator[object]:
.. pass
...
6 chỉ là lớp tạo ra các đối tượng lớpBạn thấy điều đó bằng cách kiểm tra thuộc tính
subprocess.call[["ls", "-l"]]
83Mọi thứ, và ý tôi là mọi thứ, là một đối tượng trong Python. Điều đó bao gồm số nguyên, chuỗi, hàm và lớp. Tất cả đều là đối tượng. Và tất cả chúng đã được tạo ra từ một lớp
import subprocess
subprocess.run[["ls", "-l"]]
1Bây giờ,
subprocess.call[["ls", "-l"]]
83 của bất kỳ subprocess.call[["ls", "-l"]]
83 nào là gì?import subprocess
subprocess.run[["ls", "-l"]]
2Vì vậy, siêu dữ liệu chỉ là thứ tạo ra các đối tượng lớp
Bạn có thể gọi nó là 'nhà máy đẳng cấp' nếu muốn
>>> class ObjectCreator[object]:
.. pass
...
6 là siêu dữ liệu tích hợp sẵn mà Python sử dụng, nhưng tất nhiên, bạn có thể tạo siêu dữ liệu của riêng mìnhthuộc tínhTrong Python 2, bạn có thể thêm thuộc tính
subprocess.call[["ls", "-l"]]
87 khi viết một lớp [xem phần tiếp theo để biết cú pháp Python 3]import subprocess
subprocess.run[["ls", "-l"]]
3Nếu bạn làm như vậy, Python sẽ sử dụng siêu dữ liệu để tạo lớp
subprocess.call[["ls", "-l"]]
89Cẩn thận, nó khó
Bạn viết
subprocess.call[["ls", "-l"]]
10 trước, nhưng đối tượng lớp subprocess.call[["ls", "-l"]]
89 chưa được tạo trong bộ nhớPython sẽ tìm kiếm
subprocess.call[["ls", "-l"]]
87 trong định nghĩa lớp. Nếu nó tìm thấy nó, nó sẽ sử dụng nó để tạo lớp đối tượng subprocess.call[["ls", "-l"]]
89. Nếu không, nó sẽ sử dụng >>> class ObjectCreator[object]:
.. pass
...
6 để tạo lớpĐọc cái đó mấy lần
khi bạn làm
import subprocess
subprocess.run[["ls", "-l"]]
4Python làm như sau
Có thuộc tính
subprocess.call[["ls", "-l"]]
87 trong subprocess.call[["ls", "-l"]]
89 không?Nếu có, hãy tạo trong bộ nhớ một đối tượng lớp [tôi đã nói là một đối tượng lớp, hãy ở lại với tôi ở đây], với tên
subprocess.call[["ls", "-l"]]
89 bằng cách sử dụng những gì có trong subprocess.call[["ls", "-l"]]
87Nếu Python không thể tìm thấy
subprocess.call[["ls", "-l"]]
87, nó sẽ tìm kiếm một subprocess.call[["ls", "-l"]]
87 ở cấp độ MODULE và cố gắng làm điều tương tự [nhưng chỉ đối với các lớp không kế thừa bất cứ thứ gì, về cơ bản là các lớp kiểu cũ]Sau đó, nếu nó không thể tìm thấy bất kỳ
subprocess.call[["ls", "-l"]]
87 nào, nó sẽ sử dụng siêu dữ liệu riêng của subprocess.call[["ls", "-l"]]
42 [cha đầu tiên] [có thể là >>> class ObjectCreator[object]:
.. pass
...
6 mặc định] để tạo đối tượng lớpHãy cẩn thận ở đây rằng thuộc tính
subprocess.call[["ls", "-l"]]
87 sẽ không được kế thừa, siêu dữ liệu của cha mẹ [subprocess.call[["ls", "-l"]]
45] sẽ là. Nếu subprocess.call[["ls", "-l"]]
42 sử dụng thuộc tính subprocess.call[["ls", "-l"]]
87 đã tạo subprocess.call[["ls", "-l"]]
42 với subprocess.call[["ls", "-l"]]
49 [chứ không phải cat file.txt | python3.1 prearg - postarg
00], các lớp con sẽ không kế thừa hành vi đóBây giờ câu hỏi lớn là, bạn có thể đặt gì vào
subprocess.call[["ls", "-l"]]
87?Câu trả lời là một cái gì đó có thể tạo ra một lớp học
Và những gì có thể tạo ra một lớp học?
Siêu dữ liệu trong Python 3Cú pháp đặt siêu dữ liệu đã được thay đổi trong Python 3
import subprocess
subprocess.run[["ls", "-l"]]
5i. e. thuộc tính
subprocess.call[["ls", "-l"]]
87 không còn được sử dụng, thay vào đó là đối số từ khóa trong danh sách các lớp cơ sởTuy nhiên, hành vi của siêu dữ liệu hầu như không thay đổi
Một điều được thêm vào siêu dữ liệu trong Python 3 là bạn cũng có thể chuyển các thuộc tính dưới dạng đối số từ khóa vào siêu dữ liệu, như vậy
import subprocess
subprocess.run[["ls", "-l"]]
6Đọc phần bên dưới để biết cách Python xử lý việc này
Siêu dữ liệu tùy chỉnhMục đích chính của siêu dữ liệu là tự động thay đổi lớp khi nó được tạo
Bạn thường làm điều này cho các API, nơi bạn muốn tạo các lớp phù hợp với ngữ cảnh hiện tại
Hãy tưởng tượng một ví dụ ngớ ngẩn, nơi bạn quyết định rằng tất cả các lớp trong mô-đun của bạn phải có các thuộc tính được viết hoa. Có một số cách để thực hiện việc này, nhưng một cách là đặt
subprocess.call[["ls", "-l"]]
87 ở cấp độ mô-đunBằng cách này, tất cả các lớp của mô-đun này sẽ được tạo bằng cách sử dụng siêu dữ liệu này và chúng ta chỉ cần yêu cầu siêu dữ liệu chuyển tất cả các thuộc tính thành chữ hoa
May mắn thay,
subprocess.call[["ls", "-l"]]
87 thực sự có thể là bất kỳ lớp nào có thể gọi được, nó không cần phải là một lớp chính thức [tôi biết, thứ gì đó có 'lớp' trong tên của nó không cần phải là một lớp, hãy xem. nhưng nó hữu ích]Vì vậy, chúng ta sẽ bắt đầu với một ví dụ đơn giản, bằng cách sử dụng hàm
import subprocess
subprocess.run[["ls", "-l"]]
7Hãy kiểm tra
import subprocess
subprocess.run[["ls", "-l"]]
8Bây giờ, hãy làm giống hệt như vậy, nhưng sử dụng một lớp thực cho một siêu dữ liệu
import subprocess
subprocess.run[["ls", "-l"]]
9Bây giờ chúng ta hãy viết lại những điều trên, nhưng với các tên biến ngắn hơn và thực tế hơn khi chúng ta biết ý nghĩa của chúng
subprocess.call[["ls", "-l"]]
0Bạn có thể nhận thấy đối số bổ sung
cat file.txt | python3.1 prearg - postarg
06. Không có gì đặc biệt về nó. cat file.txt | python3.1 prearg - postarg
07 luôn nhận lớp mà nó được định nghĩa, làm tham số đầu tiên. Giống như bạn có cat file.txt | python3.1 prearg - postarg
08 cho các phương thức thông thường nhận thể hiện làm tham số đầu tiên hoặc lớp xác định cho các phương thức lớpNhưng điều này không đúng OOP. Chúng tôi đang gọi trực tiếp cho
>>> class ObjectCreator[object]:
.. pass
...
6 và chúng tôi không ghi đè hoặc gọi cho phụ huynh cat file.txt | python3.1 prearg - postarg
07. Hãy làm điều đó thay vào đósubprocess.call[["ls", "-l"]]
1Chúng ta có thể làm cho nó sạch hơn nữa bằng cách sử dụng
cat file.txt | python3.1 prearg - postarg
11, điều này sẽ giúp dễ dàng thừa kế [vì có, bạn có thể có siêu dữ liệu, kế thừa từ siêu dữ liệu, kế thừa từ loại]subprocess.call[["ls", "-l"]]
2Ồ, và trong Python 3 nếu bạn thực hiện cuộc gọi này với các đối số từ khóa, như thế này
subprocess.call[["ls", "-l"]]
3Nó chuyển thành cái này trong siêu dữ liệu để sử dụng nó
subprocess.call[["ls", "-l"]]
4Đó là nó. Thực sự không có gì hơn về siêu dữ liệu
Lý do đằng sau sự phức tạp của mã khi sử dụng siêu dữ liệu không phải là do siêu dữ liệu, mà là vì bạn thường sử dụng siêu dữ liệu để thực hiện những thứ phức tạp dựa trên nội quan, thao tác thừa kế, các vars như
cat file.txt | python3.1 prearg - postarg
12, v.v.Thật vậy, siêu dữ liệu đặc biệt hữu ích để thực hiện ma thuật đen, và do đó, những thứ phức tạp. Nhưng bản thân chúng thì đơn giản
- chặn việc tạo lớp
- sửa đổi lớp
- trả lại lớp đã sửa đổi
Vì
subprocess.call[["ls", "-l"]]
87 có thể chấp nhận bất kỳ cuộc gọi nào, tại sao bạn lại sử dụng một lớp vì nó rõ ràng là phức tạp hơn?Có một số lý do để làm như vậy
- Ý định rõ ràng. Khi bạn đọc
14, bạn sẽ biết điều gì sẽ xảy ra tiếp theocat file.txt | python3.1 prearg - postarg
- Bạn có thể sử dụng OOP. Siêu dữ liệu có thể kế thừa từ siêu dữ liệu, ghi đè các phương thức cha. Siêu dữ liệu thậm chí có thể sử dụng siêu dữ liệu
- Các lớp con của một lớp sẽ là thể hiện của siêu dữ liệu của nó nếu bạn đã chỉ định một lớp siêu dữ liệu, nhưng không phải với hàm siêu dữ liệu
- Bạn có thể cấu trúc mã của mình tốt hơn. Bạn không bao giờ sử dụng siêu dữ liệu cho những thứ tầm thường như ví dụ trên. Nó thường dành cho một cái gì đó phức tạp. Có khả năng tạo một số phương thức và nhóm chúng trong một lớp rất hữu ích để làm cho mã dễ đọc hơn
- Bạn có thể kết nối với
07,cat file.txt | python3.1 prearg - postarg
16 vàcat file.txt | python3.1 prearg - postarg
17. Điều này sẽ cho phép bạn làm những việc khác nhau, Ngay cả khi thông thường bạn có thể làm tất cả trongcat file.txt | python3.1 prearg - postarg
07, một số người vẫn cảm thấy thoải mái hơn khi sử dụngcat file.txt | python3.1 prearg - postarg
16cat file.txt | python3.1 prearg - postarg
- Chúng được gọi là siêu dữ liệu, chết tiệt. Nó phải có ý nghĩa gì đó
Bây giờ câu hỏi lớn. Tại sao bạn lại sử dụng một số tính năng dễ bị lỗi tối nghĩa?
Chà, thường thì bạn không
Siêu dữ liệu là phép thuật sâu sắc hơn mà 99% người dùng không bao giờ phải lo lắng về điều đó. Nếu bạn tự hỏi liệu bạn có cần chúng hay không, thì bạn không cần [những người thực sự cần chúng biết chắc chắn rằng họ cần chúng và không cần lời giải thích tại sao]
Python Guru Tim Peters
Trường hợp sử dụng chính cho siêu dữ liệu là tạo API. Một ví dụ điển hình của điều này là Django ORM. Nó cho phép bạn xác định một cái gì đó như thế này
subprocess.call[["ls", "-l"]]
5Nhưng nếu bạn làm điều này
subprocess.call[["ls", "-l"]]
6Nó sẽ không trả về một đối tượng
cat file.txt | python3.1 prearg - postarg
20. Nó sẽ trả về một subprocess.call[["ls", "-l"]]
81 và thậm chí có thể lấy nó trực tiếp từ cơ sở dữ liệuĐiều này là có thể bởi vì
cat file.txt | python3.1 prearg - postarg
22 định nghĩa subprocess.call[["ls", "-l"]]
87 và nó sử dụng một số phép thuật sẽ biến cat file.txt | python3.1 prearg - postarg
24 mà bạn vừa xác định bằng các câu lệnh đơn giản thành một móc nối phức tạp với trường cơ sở dữ liệuDjango làm cho thứ gì đó phức tạp trở nên đơn giản bằng cách hiển thị một API đơn giản và sử dụng siêu dữ liệu, tạo lại mã từ API này để thực hiện công việc thực sự đằng sau hậu trường
Lời cuốiĐầu tiên, bạn biết rằng các lớp là các đối tượng có thể tạo các thể hiện
Chà, trên thực tế, bản thân các lớp là các thể hiện. Của siêu dữ liệu
subprocess.call[["ls", "-l"]]
7Mọi thứ đều là một đối tượng trong Python và tất cả chúng đều là thể hiện của lớp hoặc thể hiện của siêu dữ liệu
Ngoại trừ
>>> class ObjectCreator[object]:
.. pass
...
6>>> class ObjectCreator[object]:
.. pass
...
6 thực sự là siêu dữ liệu của chính nó. Đây không phải là thứ bạn có thể sao chép bằng Python thuần túy và được thực hiện bằng cách gian lận một chút ở cấp độ triển khaiThứ hai, siêu dữ liệu phức tạp. Bạn có thể không muốn sử dụng chúng để thay đổi lớp rất đơn giản. Bạn có thể thay đổi các lớp bằng cách sử dụng hai kỹ thuật khác nhau