Если у вас есть таблица 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
Ну, в проверке типа нет ничего антипифонического. Сказав это, если вы готовы возложить небольшую нагрузку на вызывающего:
def func( *files ):
for f in files:
doSomethingWithFile( f )
func( *['file1','file2','file3'] ) #Is treated like func('file1','file2','file3')
func( 'file1' )
Я бы сказал, что это более питонично в том смысле, что «явное лучше, чем неявное». Здесь есть, по крайней мере, распознавание со стороны вызывающего абонента, когда ввод уже находится в форме списка.
Вараргс сбил меня с толку, поэтому я протестировал его на 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']
Надеюсь, что это поможет кому-то еще.
Лично мне не очень нравится такое поведение - это мешает утиной печати. Можно утверждать, что он не подчиняется мантре «Явное лучше, чем неявное». Почему бы не использовать синтаксис varargs:
def func( *files ):
for f in files:
doSomethingWithFile( f )
func( 'file1', 'file2', 'file3' )
func( 'file1' )
func( *listOfFiles )
Я бы сказал, что наиболее подходящим для Python способом является заставить пользователя всегда передавать список, даже если в нем только один элемент. Это делает очевидным, что func ()
может принимать список файлов
def func(files):
for cur_file in files:
blah(cur_file)
func(['file1'])
Как предложил Дэйв, вы можете использовать синтаксис func (* files)
, но мне никогда не нравилась эта функция , и кажется более явным («явное лучше, чем неявное») просто требовать список. Это также превращает ваш частный случай (вызов func
с одним файлом) в случай по умолчанию, потому что теперь вам нужно использовать дополнительный синтаксис для вызова func
со списком ..
] Если вы хотите создать особый случай для аргумента, являющегося строкой, используйте встроенную функцию isinstance ()
,
def func(files):
for f in files if not isinstance(files, basestring) else [files]:
doSomethingWithFile(f)
func(['file1', 'file2', 'file3'])
func('file1')