如果args
是整数,我需要做一件事,如果args
是字符串,我需要做一件事。
我怎么能打字?例如:
def handle(self, *args, **options):
if not args:
do_something()
elif args is integer:
do_some_ather_thing:
elif args is string:
do_totally_different_thing()
答案 0 :(得分:13)
首先,*args
始终是一个列表。您想检查其内容是否为字符串?
import types
def handle(self, *args, **options):
if not args:
do_something()
# check if everything in args is a Int
elif all( isinstance(s, types.IntType) for s in args):
do_some_ather_thing()
# as before with strings
elif all( isinstance(s, types.StringTypes) for s in args):
do_totally_different_thing()
它使用types.StringTypes
,因为Python实际上有两种字符串:unicode和bytestrings - 这种方式都有效。
在Python3中,内置类型已从types
lib中删除,并且只有一种字符串类型。
这意味着类型检查看起来像isinstance(s, int)
和isinstance(s, str)
。
答案 1 :(得分:1)
您也可以尝试以更加Pythonic的方式执行此操作而不使用type
或isinstance
(首选,因为它支持继承):
if not args:
do_something()
else:
try:
do_some_other_thing()
except TypeError:
do_totally_different_thing()
这显然取决于do_some_other_thing()
的作用。
答案 2 :(得分:0)
type(variable_name)
然后你需要使用:
if type(args) is type(0):
blabla
上面我们比较变量args的类型是否与作为整数的文字0
相同,如果你想知道例如类型是否为long,则与{{1}进行比较等等。
答案 3 :(得分:0)
如果您知道您期望一个整数/字符串参数,则不应将其吞入*args
。做
def handle( self, first_arg = None, *args, **kwargs ):
if isinstance( first_arg, int ):
thing_one()
elif isinstance( first_arg, str ):
thing_two()
答案 4 :(得分:0)
没有人提到它,但更容易请求宽恕原则可能适用,因为我认为你将使用该整数做某事:
def handle(self, *args, **kwargs):
try:
#Do some integer thing
except TypeError:
#Do some string thing
当然,如果整数事物正在修改列表中的值,那么您应该先检查一下。当然,如果你想循环遍历args
并为整数和其他字符串做一些事情:
def handle(self, *args, **kwargs):
for arg in args:
try:
#Do some integer thing
except TypeError:
#Do some string thing
当然这也假设try中没有其他操作会抛出TypeError。