2016-07-25 28 views
0

我是Python新手,正在学习输入/输出。现在,我试图从我从命令行输入中指定的文件中将对象添加到对象中。从命令行输入初始化Python对象

例如,我要运行以下命令:$ /...filepath.../ python3 myCode.py < 06传递文件06

$ /...filepath.../ cat 06 
7 
4 5 2 7 88 2 1 

的内容myCode.pymyCode.py06都位于相同的目录中。

我试图创建从属性的命令行调用一个MyClass对象如下:

## myCode.py ## 

# create class 
class MyClass(object): 
    def __init__(self): 
    self._num_one = int(sys.stdin.readline())  
    self._num_many = [int(x) for x in sys.stdin.readline().split()] 

# print attributes 
print(MyClass()._num_many) 
print(MyClass()._num_one) 

,但我发现了以下错误​​为self._num_one,但我能TOR打印self._num_many和我不知道为什么。如果我交换self._num_oneself.num_many的订单,那么我可以得到self._num_one。由于06只有两行,所以我最初没有读第一行吗?为什么我只能打印这两个属性中的一个,以及如何打印这两个属性?

非常感谢。

+1

它通常被认为是糟糕的设计,在类初始化器中有复杂的操作,如IO。在这种情况下,每次你想创建一个新的对象都会从stdin中读取。这使得测试变得更加困难。最好使用“工厂函数”来读取标准输入,解析输入,然后用合适的类型实例化类。 – Keith

回答

0

有一些问题,你的代码,从工作停止。

首先,如果您正在逐行读取输入文件,则需要先删除前后的空白。这意味着在.readline()之后致电.strip()方法。您正在获取ValueError,因为int()无法处理非数字字符串。

>>> int('x') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: 'x' 
>>> int(' ') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: ' ' 
>>> int('\n') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: '\n' 
>>> int('1') 
1 

所以代码变得

class MyClass(object): 
    def __init__(self): 
     self._num_one = int(sys.stdin.readline().strip()) 
     self._num_many = [int(x) for x in sys.stdin.readline().strip().split()] 

其次,当你做MyClass()它实例化一个新的对象。如果我正确理解代码,则期望读两行两次(共4行)。鉴于输入文件,我假设您有兴趣实例化ONE对象。因此,我们实例化一个,并将其标记为变量,然后再使用该参考。

instantiatedObject = MyClass() 
print(instantiatedObject._num_many) 
print(instantiatedObject._num_one) 
0

仅仅因为你的输入流不是int,它是一个带空格和“\ n”分隔符的字符串,你必须首先处理这些东西。

的快速简便的方法是改变你的代码是这样的(未测试):

self._num_one = int("".join(sys.stdin.readline().split()))