LINUX.ORG.RU

Python, функция


0

0

Пишу скрипт на питоне. У функции несколько агрументов. Если один из них не задан, не должно выполнятся действие, связанное в этим аргументом. Как такое можно сделать?

anonymous

эм, как минимум так:

def func(arg1=None,arg2=None,...):
""" My super function. """
if arg1!=None:
process_a1()
if arg2!=None:
process_a2()
...

nnkd
()

(чертово форматирование)
эм, как минимум так:

def func(arg1=None,arg2=None,...):
    """ My super function. """
    if arg1!=None:
        process_a1()
    if arg2!=None:
        process_a2()
    ...

nnkd
()
Ответ на: комментарий от nnkd

А если аргумент пустой? Значение аргумента берется из параметров запуска скрипта. Если параметр не задан, то и аргумент будет пуст. И действие, связанное с ним выполнять не нужно. В таком случае ваш вариант подойдет?

anonymous
()
Ответ на: комментарий от anonymous

Подойдет.
Например:
Если 1 аргумент пустой, вызывай функцию только со 2 аргументом:
fun( arg2 = "v" )

sleepflint ★★★
()
Ответ на: комментарий от alexru

<буквоедство on> "c is not None" вместо "c != None" </буквоедство off>

phoenix ★★★★
()
Ответ на: комментарий от anonymous

Как вариант:

import sys

def func(*args):
    if 'help' in args:
        print 'HELP'
    if 'aaa' in args:
        print 'AAA'

func(*sys.argv)

Если аргументы простые (не типа var=val), то пойдёт.
Ещё как вариант сделать хэш типа:
lookup_table = {
    'help': help_func,
    'aaa': aaa_func,
    'bbb': bbb_func,
}
И потом вызывать функцию по таблице.

AlexKiriukha ★★★★
()
Ответ на: комментарий от AlexKiriukha

Вот еще проблема. Подскажите, пожалуйста

def postProcessArgs(argTup):
	global dirToListG, writeDirG, oldTrackG, newTrackG
	if argTup[0]: dirToList = argTup[0]
	else:
		try:
			dirToList = dirToListG
		except:
			sys.stderr.write('Must specify a directory to list%s' % os.linesep )
			sys.exit(1)
	if argTup[1]: writeDir = argTup[1]
	else:
		try:
			writeDir = writeDirG
		except:
			sys.stderr.write('Must specify a write directory%s' % os.linesep)
			sys.exit(1)
	if argTup[2]: oldTrack = argTup[2]
	else:
		try:
			oldTrack = oldTrackG
		except: oldTrack = argTup[2]
	if argTup[3]: newTrack = argTup[3]
	else:
		try:
			newTrack = newTrackG
		except:
			sys.stderr.write('Must specify a new tracker to set%s' % os.linesep)
			sys.exit(1)
	if argTup[4]: newName = argTup[4]
	postaction = argTup[5]
	return dirToList, writeDir, oldTrack, newTrack, newName, postaction

Вызывается так:
dirToList, writeDir, oldTrack, newTrack, newName, postaction = postProcessArgs('/home/dsef/testt', '/home/dsef', None, 'proverka', None, None)

и если newName не задан, пишет ошибку
UnboundLocalError: local variable 'newName' referenced before assignment

anonymous
()
Ответ на: комментарий от anonymous

if argTup[4]:
  newName = argTup[4]
else:
  newName = None

Опять-же newName - это локальная переменная в функции и когда делается 
return берется значение неинициализированной переменной.

alexru ★★★★
()
Ответ на: комментарий от alexru

Большое спасибо :) Я только начал изучать питон. А не посоветуете толковую книжку по питону для начинающего, или в инете что-нибудь на русском желательно.

anonymous
()
Ответ на: комментарий от atoku

> Зачем сравнивать с None???

if not c гораздо медленнее чем if c is not None, т.к. первое полезет искать и выполнять __len__, __empty__, а то еще и через __getattr__ и дескрипторы пройдет, а второе просто сравнит сишные указатели.

anonymous
()
Ответ на: комментарий от anonymous

Также читайте PEP 8 до просветления, там четко написано:

Comparisons to singletons like None should always be done with 'is' or 'is not', never the equality operators.

Also, beware of writing "if x" when you really mean "if x is not None" -- e.g. when testing whether a variable or argument that defaults to None was set to some other value.

anonymous
()
Ответ на: комментарий от anonymous

Есть подозрение, что вам не стоит изобретать велосипед, а стоит использовать стандартные модули:

http://docs.python.org/lib/module-getopt.html http://docs.python.org/lib/module-optparse.html

Также, никогда не используйте try/except без указания какое исключение ждете.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.