Python đọc đối số từ stdin

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ẩn

import 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

>>> class ObjectCreator[object]:
..       pass
...

>>> my_object = ObjectCreator[]
>>> print[my_object]

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

Trên Python 3. 4 trở về trước, sử dụng

>>> class ObjectCreator[object]:
..       pass
...
0 thay vì
>>> class ObjectCreator[object]:
..       pass
...
1

subprocess.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
...
3

Bả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 động

Vì 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
...
2

subprocess.call[["ls", "-l"]]
8

Như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ông

Nhớ chức năng

>>> class ObjectCreator[object]:
..       pass
...
6?

subprocess.call[["ls", "-l"]]
1

Chà, 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ày

subprocess.call[["ls", "-l"]]
4

Ở đâu

  • subprocess.call[["ls", "-l"]]
    
    60. tên của lớp
  • subprocess.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ính

e. g

cat file.txt | python3.1 prearg - postarg
0

có thể được tạo thủ công theo cách này

cat file.txt | python3.1 prearg - postarg
1

Bạ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ên

cat file.txt | python3.1 prearg - postarg
2

Có thể được dịch sang

cat file.txt | python3.1 prearg - postarg
3

Và được sử dụng như một lớp bình thường

cat file.txt | python3.1 prearg - postarg
4

Và tất nhiên, bạn có thể kế thừa từ nó, vì vậy

cat file.txt | python3.1 prearg - postarg
5

sẽ là

cat file.txt | python3.1 prearg - postarg
6

Cuố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
7

Và 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
8

Bạ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ệu

Siê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
9

Bạn đã thấy rằng

>>> class ObjectCreator[object]:
..       pass
...
6 cho phép bạn làm điều gì đó như thế này

import 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ường

Bâ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ớp

Bạn thấy điều đó bằng cách kiểm tra thuộc tính

subprocess.call[["ls", "-l"]]
83

Mọ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"]]
1

Bâ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"]]
2

Vì 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ình

thuộc tính

Trong 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"]]
3

Nế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"]]
89

Cẩ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"]]
4

Python 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"]]
87

Nế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ớp

Hã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 3

Cú pháp đặt siêu dữ liệu đã được thay đổi trong Python 3

import subprocess
subprocess.run[["ls", "-l"]]
5

i. 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ỉnh

Mụ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ô-đun

Bằ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"]]
7

Hãy kiểm tra

import subprocess
subprocess.run[["ls", "-l"]]
8

Bâ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"]]
9

Bâ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"]]
0

Bạ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ớp

Như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"]]
1

Chú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"]]
3

Nó 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
Tại sao bạn lại sử dụng các lớp siêu dữ liệu thay vì các hàm?

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
    cat file.txt | python3.1 prearg - postarg
    
    14, bạn sẽ biết điều gì sẽ xảy ra tiếp theo
  • 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
    cat file.txt | python3.1 prearg - postarg
    
    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ả trong
    cat 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ụng
    cat file.txt | python3.1 prearg - postarg
    
    16
  • Chúng được gọi là siêu dữ liệu, chết tiệt. Nó phải có ý nghĩa gì đó
Tại sao bạn sẽ sử dụng siêu dữ liệu?

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"]]
5

Nhưng nếu bạn làm điều này

subprocess.call[["ls", "-l"]]
6

Nó 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ệu

Django 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"]]
7

Mọ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 khai

Thứ 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

Làm cách nào để đọc dữ liệu từ stdin trong Python?

Có ba cách để đọc dữ liệu từ stdin trong Python. .
hệ thống. tiêu chuẩn
hàm tích hợp input[]
tập tin đầu vào. hàm đầu vào []

Làm cách nào để đọc đối số trong Python?

Ba loại phổ biến nhất là. sử dụng sys. argv. Sử dụng mô-đun getopt. .
Nó là một danh sách các đối số dòng lệnh
len[sys. argv] cung cấp số lượng đối số dòng lệnh
hệ thống. argv[0] là tên của tập lệnh Python hiện tại

Làm thế nào để đọc đầu vào từ stdin?

Đọc đầu vào từ stdin trong Python bằng fileinput. đầu vào[] . Để sử dụng phương pháp này, trước tiên, chúng ta cần nhập fileinput

Làm cách nào để đọc nhiều dòng từ stdin trong Python?

Nhập chuỗi của bạn vào nhiều dòng. Sau khi bạn hoàn thành việc cung cấp cho người dùng thông tin nhập trong nhiều dòng, hãy nhấn ctrl+d . Nó gửi tín hiệu EOF đến hệ thống của bạn. Nếu bạn là người dùng windows, hãy sử dụng ctrl+z thay vì ctrl+d.

Chủ Đề