Как я могу сказать, является ли переменная Python строкой или списком?

Если у вас есть таблица customer с именем customer_name и идентификатором для соединения customer_trn, вы можете

SELECT t1.customer_trn, t1.cust_avg, c.username 
from (
SELECT customer_trn, avg(balance)  cust_avg
FROM 
  ( 
  SELECT depositor.customer_trn, account.account_number, account.balance 
  FROM account 
      INNER JOIN savings_account ON account.account_number = savings_account.account_number 
      INNER JOIN depositor ON depositor.account_number = account.account_number 
    UNION ALL 
   SELECT depositor.customer_trn, account.account_number, account.balance FROM 
    account 
      INNER JOIN checking_account ON account.account_number = checking_account.account_number 
      INNER JOIN depositor ON depositor.account_number = account.account_number 
  )   AS subquery2 
  GROUP BY customer_trn 

) t1 
inner join  customer ON c.id = t1.customer_trn
61
задан James McMahon 8 May 2009 в 01:04
поделиться

7 ответов

Ну, в проверке типа нет ничего антипифонического. Сказав это, если вы готовы возложить небольшую нагрузку на вызывающего:

def func( *files ):
    for f in files:
         doSomethingWithFile( f )

func( *['file1','file2','file3'] ) #Is treated like func('file1','file2','file3')
func( 'file1' )

Я бы сказал, что это более питонично в том смысле, что «явное лучше, чем неявное». Здесь есть, по крайней мере, распознавание со стороны вызывающего абонента, когда ввод уже находится в форме списка.

37
ответ дан 24 November 2019 в 17:05
поделиться
if hasattr(f, 'lower'): print "I'm string like"
11
ответ дан 24 November 2019 в 17:05
поделиться

Вараргс сбил меня с толку, поэтому я протестировал его на Python, чтобы прояснить его для себя.

Прежде всего, PEP для varargs здесь здесь .

Вот пример программы, основанный на двух ответах от Дейва и Дэвида Бергера, за которым следует вывод, просто для пояснения.

def func( *files ):
    print files
    for f in files:
        print( f )

if __name__ == '__main__':
    func( *['file1','file2','file3'] ) #Is treated like func('file1','file2','file3')
    func( 'onestring' )
    func( 'thing1','thing2','thing3' )
    func( ['stuff1','stuff2','stuff3'] )

И итоговый результат;

('file1', 'file2', 'file3')
file1
file2
file3
('onestring',)
onestring
('thing1', 'thing2', 'thing3')
thing1
thing2
thing3
(['stuff1', 'stuff2', 'stuff3'],)
['stuff1', 'stuff2', 'stuff3']

Надеюсь, что это поможет кому-то еще.

3
ответ дан 24 November 2019 в 17:05
поделиться
isinstance(your_var, basestring)
43
ответ дан 24 November 2019 в 17:05
поделиться

Лично мне не очень нравится такое поведение - это мешает утиной печати. Можно утверждать, что он не подчиняется мантре «Явное лучше, чем неявное». Почему бы не использовать синтаксис varargs:

def func( *files ):
    for f in files:
        doSomethingWithFile( f )

func( 'file1', 'file2', 'file3' )
func( 'file1' )
func( *listOfFiles )
32
ответ дан 24 November 2019 в 17:05
поделиться

Я бы сказал, что наиболее подходящим для Python способом является заставить пользователя всегда передавать список, даже если в нем только один элемент. Это делает очевидным, что func () может принимать список файлов

def func(files):
    for cur_file in files:
        blah(cur_file)

func(['file1'])

Как предложил Дэйв, вы можете использовать синтаксис func (* files) , но мне никогда не нравилась эта функция , и кажется более явным («явное лучше, чем неявное») просто требовать список. Это также превращает ваш частный случай (вызов func с одним файлом) в случай по умолчанию, потому что теперь вам нужно использовать дополнительный синтаксис для вызова func со списком ..

] Если вы хотите создать особый случай для аргумента, являющегося строкой, используйте встроенную функцию isinstance () ,

16
ответ дан 24 November 2019 в 17:05
поделиться
def func(files):
    for f in files if not isinstance(files, basestring) else [files]:
        doSomethingWithFile(f)

func(['file1', 'file2', 'file3'])

func('file1')
11
ответ дан 24 November 2019 в 17:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: