Создание кода Python Python - PullRequest
0 голосов
/ 22 декабря 2009

Как бы вы сделали код более Pythonic?

Я хочу получить контуры из образца, например /usr/local/sources/devel/algebra.py: def _alg(...) без символа :.

Мой код

import os
FunctionPath = "/usr/local/sources/devel/sage-main/build/sage/"
cmd = "grep -R 'def ' %s | cut -d' ' -f1" % (FunctionPath)
cmd += ' &'
raw_path = os.system(cmd)
path = raw_path.replace(':', '')       // not working

print path   

[править]: код не может быть написан на языке только со встроенными функциями.

Ответы [ 4 ]

11 голосов
/ 22 декабря 2009

Почему бы не сделать это:

for line in open(FunctionPath):
    line = line.strip()
    if line.startswith('def '):
        print '%s: %s' % (FunctionPath, line.partition(':')[0])

А если вы используете модуль fileinput , вы можете очень легко перебирать строки из нескольких входных потоков:

import fileinput
for line in fileinput.input(paths):
    line = line.strip()
    if line.startswith('def '):
        print '%s: %s' % (fileinput.filename(), line.partition(':')[0])

Кстати, если вы не укажете fileinput.input какой-либо путь, он будет использовать sys.argv по умолчанию, поэтому вы можете запустить свой скрипт на python так:

$ python script.py filepath1 filepath2 filepath3

fileinput будет читать файлы для вас.

если вы действительно хотите охватить все случаи, вам не следует использовать replace (':', ''), потому что возможно иметь

def func(): #comment myfunc():
   pass

Следующее даст вам правильный результат:

>>> 'def func(): #comment myfunc():'.partition(':')[0]
'def func()'

Если вы не хотите, чтобы комментарий также.

1 голос
/ 22 декабря 2009

Если вы используете Python главным образом как оболочку для sh, почему бы не сделать все непосредственно из оболочки?

set SEARCH_PATH=/usr/local/sources/devel/sage-main/build/sage/
grep -R 'def ' $SEARCH_PATH | awk -F':' '{print $1 $2}'
1 голос
/ 22 декабря 2009

То же самое с os.walk

for path, dirnames, filenames in os.walk(function_path):
    for filename in filenames:
        path = os.path.join(path, filename)
        with open(path) as f:
             for line in f:
                 # Instead of grep
                 if 'def ' in line:
                       # Instead of cut
                       data = line.split(' ')[2]
                       print data.replace(":", '')
1 голос
/ 22 декабря 2009

Буквально: «без модулей OS, подпроцесса или Popen»

Вы также можете использовать команды модуль: P

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