Как проверить тип переменной?питон - PullRequest
5 голосов
/ 09 августа 2010

Мне нужно сделать одну вещь, если 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()

Ответы [ 5 ]

13 голосов
/ 09 августа 2010

Прежде всего, *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, и есть только один тип строки. Это означает, что проверки типов выглядят как isinstance(s, int) и isinstance(s, str).

1 голос
/ 09 августа 2010

Вы также можете попробовать сделать это более Pythonic, не используя type или isinstance (желательно, потому что он поддерживает наследование):

if not args:
     do_something()
else:
     try:
        do_some_other_thing()
     except TypeError:
        do_totally_different_thing()

Очевидно, это зависит от того, что делает do_some_other_thing().

0 голосов
/ 09 августа 2010

Никто не упомянул об этом, но принцип «Проще просить прощения», вероятно, применим, поскольку я предполагаю, что вы будете что-то делать с этим целым числом:

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

Конечно, это также предполагает, что никакая другая операция в попытке не сгенерирует TypeError.

0 голосов
/ 09 августа 2010

Если вы знаете, что ожидаете целочисленный / строковый аргумент, вам не следует заглатывать его в *args. У

def handle( self, first_arg = None, *args, **kwargs ):
    if isinstance( first_arg, int ):
        thing_one()
    elif isinstance( first_arg, str ):
        thing_two()
0 голосов
/ 09 августа 2010
type(variable_name)

Тогда вам нужно использовать:

if type(args) is type(0):
   blabla

Выше мы сравниваем, если тип переменной args совпадает с литералом 0, который является целым числом, если вы хотите знать, если, например, тип long, вы сравниваете с type(0l) и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...