Как мы можем использовать argv для получения входных данных, как показано ниже для строк? - PullRequest
0 голосов
/ 16 июня 2019

Я пытался это, и, кажется, работает нормально с целыми числами, но не работает со строками. Я проверил документацию и не смог найти.

from sys import argv
a, b, c = input(argv)
print(a,b,c)

вывод:

['C:\\Users\\mani\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py', '-f', 'C:\\Users\\mani\\AppData\\Roaming\\jupyter\\runtime\\kernel-24b5eda5-a584-417e-a9f5-1c58531db5ae.json']mn nn nj

-
ValueError                                Traceback (most recent call last)
<ipython-input-23-181e7bc5c5de> in <module>
      1 from sys import argv
----> 2 a, b, c = input(argv)
      3 print(a,b,c)

ValueError: too many values to unpack (expected 3)

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Непонятно, что вы пытаетесь сделать с sys.argv. Это список строк, созданных оболочкой и интерпретатором Python. Обычно он читается, как и любой список, но также может быть изменен.

In [16]: import sys                                                                       
In [17]: sys.argv                                                                         
Out[17]: 
['/usr/local/bin/ipython3',
 '--pylab',
 'qt',
 '--nosep',
 '--term-title',
 '--InteractiveShellApp.pylab_import_all=False']
In [18]: input(sys.argv)                                                                  
['/usr/local/bin/ipython3', '--pylab', 'qt', '--nosep', '--term-title', '--InteractiveShellApp.pylab_import_all=False']1 2 3
Out[18]: '1 2 3'

При использовании в качестве аргумента для input он просто служит строкой приглашения. Какой смысл в этом? input возвращает нам строку (по крайней мере, в Py3; Py2 отличается).

a,b,c = ...

распаковка так неумолима. Возникает ошибка, если задано неправильное количество элементов в RHS.

In [19]: a,b,c = input('3 items: ').split()   # split input string on space                                            
3 items: a b c
In [20]: a,b,c = input('3 items: ').split()                                               
3 items: d e
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-20-7dacf1e93e8c> in <module>
----> 1 a,b,c = input('3 items: ').split()

ValueError: not enough values to unpack (expected 3, got 2)
In [21]: a,b,c = input('3 items: ').split()                                               
3 items: 1 2 3 4
---------------------------------------------------------------------------
...
ValueError: too many values to unpack (expected 3)

Итак, я вижу три вопроса:

  • вопрос о том, что такое sys.argv и как его можно использовать
  • в чем аргумент input do
  • хрупкое использование распаковки

===

Я думаю, вы не понимаете, что делает input и как работает распаковка:

In [67]: a,b,c = input('3 numbers: ')                                                     
3 numbers: 123
In [68]: a                                                                                
Out[68]: '1'
In [69]: b                                                                                
Out[69]: '2'
In [70]: c                                                                                
Out[70]: '3'
In [71]: a,b,c = input('3 numbers: ')                                                     
3 numbers: 1 2 3
...
ValueError: too many values to unpack (expected 3)

In [74]: a,b,c = input('3 numbers: ')                                                     
3 numbers: 1234
...
ValueError: too many values to unpack (expected 3)

Это использование input эквивалентно:

In [72]: a,b,c='123' 

3 символа в строке разделены между 3 переменными. Если вы укажете более длинную (или более короткую) строку, существует несоответствие с тремя переменными, которые требуются для распаковки.


Или повторить ваш пример, где вы набрали 'mn nn nj':

In [75]: input(['a','list','of','strings'])                                               
['a', 'list', 'of', 'strings']mn nn nj                        
Out[75]: 'mn nn nj'

In [76]: a,b,c=_        # trying to unpack that string to 3 variables                                                                  
...
ValueError: too many values to unpack (expected 3)

In [77]: a,b,c=_.split()    # split on white space                                                                  
In [78]: a,b,c                                                                            
Out[78]: ('mn', 'nn', 'nj')
0 голосов
/ 16 июня 2019
from sys import argv 
a, b, c = input(argv) 
print(a,b,c)

в некотором роде неверно, вам не нужно использовать input для распаковки argv в переменные.

from sys import argv 
a, b, c = argv[:3]
print(a,b,c)

будет достаточно, если вам нужны только первые 3 элемента из argv для распаковки в a, b и c.

Проверьте Введение в Python и прочитайте о нарезке (волшебная вещь [:3]).

...