2013-04-30 95 views
0

我对python编程颇为陌生,我来自Unix/Linux管理和shell脚本背景。我试图用python编写一个程序,它接受命令行参数,并根据类型(int,str)执行某些操作。但在我的情况下,输入总是被当作字符串处理。请咨询。Python中位置参数的类型

#!/usr/bin/python 
import os,sys,string 
os.system('clear') 

# function definition 
def fun1(a): 
      it = type(1) 
      st = type('strg') 
      if type(a) == it: 
       c = a ** 3 
       print ("Cube of the give int value %d is %d" % (a,c)) 
      elif type(a) == st: 
       b = a+'.' 
       c = b * 3 
       print ("Since given input is string %s ,the concatenated output is %s" % (a,c)) 


a=sys.argv[1] 
fun1(a) 
+4

为什么不使用['argparse'(http://docs.python.org/2.7/library/argparse.html)? – jamylak 2013-04-30 06:59:22

+1

你可以尝试一个isinstance(,)在if - elif - else – techiev2 2013-04-30 06:59:51

+0

我同意TechieV2。 isinstance()可能是最简单的方法。 – pypat 2013-04-30 07:01:01

回答

0

首先,输入将始终被视为字符串。

你可以使用argparse

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("cube", type=int, 
       help="Cube of the give int value ") 

args = parser.parse_args() 
answer = args.cube**3 

print answer 

python prog.py 4 
64 

所有整数有一个属性__int__,因此您可以使用该属性int和字符串之间进行区分。

if hasattr(intvalue, __int__): 
    print "Integer" 
+0

我认为你的意思是'args.cube' – jamylak 2013-04-30 08:29:42

+0

是的。我编辑了代码 – 2013-04-30 08:36:10

+0

这是检查'int'的不好方法。使用'isinstance(intvalue,int)' – jamylak 2013-04-30 08:37:07

1

的命令行参数的程序总是给定为字符串(这不仅是蟒蛇真的,但至少所有的C-相关的语言)。这意味着当你给一个数字如“1”作为参数时,你需要明确地将它转换为一个整数。在你的情况,你可以尝试将其转换并假定它是一个字符串,如果这不起作用:

try: 
    v = int(a) 
    #... do int related stuff 
except ValueError: 
    #... do string related stuff 

是虽然糟糕的设计,这将是更好地让如果他想参数由用户决定被解释为一个字符串 - 毕竟,用户给出的每个int也是一个有效的字符串。例如,你可以使用像argparse这样的东西,并为int指定两个不同的参数,用“-i”给出,用字符串指定“-s”。

+0

但是,如果它不是一个简单的int/string的情况下,不是一个问题,除了那里做一个尝试吗? – techiev2 2013-04-30 07:04:07

+0

@TechieV2什么时候argv中包含的值不是字符串? – l4mpi 2013-04-30 07:05:57

+0

它不应该。如果转换为int失败,将始终引发ValueError。如果你不想用不同的方式处理不同类型的原因,那么你将不得不做一些进一步的检查。 – pypat 2013-04-30 07:06:29

0
import argparse, ast 

parser = argparse.ArgumentParser(description="Process a single item (int/str)") 
parser.add_argument('item', type=ast.literal_eval, 
        help='item may be an int or a string') 
item = parser.parse_args().item 


if isinstance(item, int): 
    c = item ** 3 
    print("Cube of the give int value %d is %d" % (item,c)) 
elif isinstance(item, str): 
    b = item + '.' 
    c = b * 3 
    print("Since given input is string %s ,the concatenated output is %s" 
      % (item,c)) 
else: 
    pass # print error 
相关问题