Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908

Функция не возвращает ничего

09.08.2018, 17:59. Показов 4011. Ответов 29

Студворк — интернет-сервис помощи студентам
Накидал код по ходьбе из консоли по папкам
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import os, sys
from pathlib import Path
 
class clear:
 def __call__(self):
  import os
  if os.name==('ce','nt','dos'): os.system('cls')
  elif os.name=='posix': os.system('clear')
  else: print('\n'*120)
 def __neg__(self): self()
 def __repr__(self):
  self();return ''
 
def filedirlist(startdir):
    selectfile=''
    dirlist=[]
    otherlist=[]
    clear()
    for i in sorted(os.listdir(startdir)):
        if os.path.isdir(startdir+os.sep+i):
            dirlist.append((startdir+os.sep+i).replace(os.sep+os.sep,os.sep))
        else:
            otherlist.append((startdir+os.sep+i).replace(os.sep+os.sep,os.sep))
    otherlist.sort()
    dirlist.sort()
    dirlist.extend(otherlist)
    k=0
    print('Current dir: ' + os.path.dirname(dirlist[0]))
    print('b: back')
    for k in range(dirlist.__len__()):
        try:
            lk=os.readlink(dirlist[k])
            print('\033[96m' + ' '+ str(k) +': '+ dirlist[k].split(os.sep)[-1:][0] + '\033[00m' + ' -> ' + lk)
            lk=''
        except:
            if os.path.isdir(dirlist[k]):
                print('\033[93m' + ' ' +str(k)+': '+ dirlist[k].split(os.sep)[-1:][0] + '/' + '\033[00m')
            else:
                print(' '+str(k)+': '+dirlist[k].split(os.sep)[-1:][0])
    k=k+1
    print('e: exit')
    b = input()
    try:
        if b=='e':
            clear()
            exit
        elif b == 'b':
            clear()
            filedirlist(os.path.dirname(os.path.dirname(dirlist[0])))
        else:
            try:
                if os.readlink(dirlist[int(b)]).isdir():
                    filedirlist(os.readlink(dirlist[int(b)]))
                else:
                    selectfile=os.readlink(dirlist[int(b)])
                    print(selectfile)
                    return selectfile
            except:
                if os.path.isdir(dirlist[int(b)]):
                    filedirlist(dirlist[int(b)])
                else:
                    selectfile=dirlist[int(b)]
                    print(selectfile)
                    return selectfile
    except:
        clear()
        filedirlist(os.path.dirname(dirlist[0]))
    return print(selectfile)
print(filedirlist('/storage'))
Но она почему то не возвращает выбранный файл.
Что я делаю не так?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.08.2018, 17:59
Ответы с готовыми решениями:

Функция ничего не возвращает
Привет, помогите разобраться с кодом. Хочу написать авторегер. При заходе на сайт, должен требовать от пользователя номер и смс. На...

Почему функция ничего не возвращает?
var = list(map(int, input().split())) def func(var): if 4 <= var and var >= 20 - var: for x in range(1, 30): ...

Функция ничего не выводит
Обьясните пожалуйста почему ничего не выводит и как это исправить class abc: def __init__(self): pass def...

29
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
10.08.2018, 21:46
Студворк — интернет-сервис помощи студентам
Вот пример простого (написанного за 15 минут на коленке) консольного explorer'а, без ненужной рекурсии, которая к тому же делает код малочитабельным.
P.S. символические ссылки код не обрабатывает (лень было писать :-))



Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import os
from functools import partial
from collections import defaultdict
from pathlib import Path
 
def clear():
    os.system('cls' if os.name=='nt' else "clear")
 
# определяем тип файловой записи
def type_entry(entry):
    types = {16384:'dir',32768:'file',40960:'link'}
    for bits,type in types.items():
        if entry.stat().st_mode & bits:
            return type
 
# получаем имя файла\директории по номеру в списке
def get_path_from_int(inp):
    
    if ROOT in LAST_SCANDIR:
        try:
            inp = LAST_SCANDIR[ROOT][int(inp)]  
        except (ValueError,IndexError):
            pass 
        else:
            inp = inp.name
    return inp 
 
# сканировщик директории
def read_dir(inp):
    global ROOT
    add_entries = True
    
    inp = get_path_from_int(inp)
  
    if not os.path.isabs(inp):
        inp = os.path.realpath(os.path.join(ROOT,inp))
    
    if os.path.exists(inp):
        if not Path(inp).is_dir():
            return print("Выбран файл:",inp)
        
        if ROOT != inp: ROOT = inp
        print('ROOT:',inp)
        
        if ROOT in LAST_SCANDIR:
            entries = LAST_SCANDIR[ROOT]
            add_entries = False    
        else:
            entries = os.scandir(inp)
        
        for i,entry in enumerate(entries):
            print("{:03}:{}:{}".format(
                i,entry.name,type_entry(entry)
            ))
            if add_entries:
                LAST_SCANDIR[ROOT].append(entry)  
    else:
        print('Указанный путь не существует:',inp)
 
def main():
    while 1:
        inp = input(
            'exit: Выход\n'
            'clear:Очистка экрана\n'
            'Current dir:{}>>'.format(ROOT)
        )
        
        action = {
            '':partial(read_dir,ROOT),
            'exit':exit,
            'clear':clear
        }.get(inp,partial(read_dir,inp))()      
 
if __name__ == "__main__":
    ROOT = os.path.abspath('.')
    LAST_SCANDIR = defaultdict(list)
    main()
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
11.08.2018, 01:18
С возвратом выбранного файла и последующим завершением цикла опроса.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import os
from functools import partial
from collections import defaultdict
from pathlib import Path
 
def clear():
    os.system('cls' if os.name == 'nt' else "clear")
 
def type_entry(entry):
    types = {16384:'dir',32768:'file',40960:'link'}
    for bits,type in types.items():
        if entry.stat().st_mode & bits:
            return type
    return None
 
def get_path_from_int(inp):
    
    if ROOT in LAST_SCANDIR:
        try:
            inp = LAST_SCANDIR[ROOT][int(inp)]  
        except (ValueError,IndexError):
            pass 
        else:
            inp = inp.name
    return inp 
 
def enum_dir(inp):
    global ROOT
    add_entries = True
    
    if ROOT != inp: ROOT = inp
    print('ROOT:',inp)
    
    if ROOT in LAST_SCANDIR:
        entries = LAST_SCANDIR[ROOT]
        add_entries = False    
    else:
        entries = os.scandir(inp)
    
    for i,entry in enumerate(entries):
        print("{:04}:{}:{}".format(
            i,entry.name,
            type_entry(entry)
        ))
        if add_entries:
            LAST_SCANDIR[ROOT].append(entry) 
 
 
def read_dir(inp):
    inp = get_path_from_int(inp)
  
    if not os.path.isabs(inp):
        inp = os.path.realpath(os.path.join(ROOT,inp))
    
    if os.path.exists(inp):
        if Path(inp).is_file(): 
            return inp
        else:
            enum_dir(inp)  
    else:
        return print("Path not found",inp)  
 
def get_selected_file():
    result = None
    while 1:
        inp = input(
            'exit: Выход\n'
            'clear:Очистка экрана\n'
            'Current dir:{}>>'.format(ROOT)
        )
        
        # если вам скажут, что в Python нет switch - покажите ему это:
        result = {
            ''     :partial(read_dir,ROOT),
            'exit' :lambda:-1, # выход из цикла, без выхода из приложения
            'clear':clear      # очистка экрана консоли
        }.get(inp,
            # ветка default
            partial(read_dir,inp)
        )()      
        # выходим, если получили что-то отличное от None
        if result is not None:
            break
        
    return result
 
if __name__ == "__main__":
    ROOT = os.path.abspath('.')
    LAST_SCANDIR = defaultdict(list)
    sfile = get_selected_file()
    if sfile !=-1:
        print("Выбран файл:", sfile)
    else:
        print("Файл не выбран")
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
11.08.2018, 20:13
Немного доработанный вариант кода с обработкой ссылок и даже ссылок на ссылку на ссылку на ссылку и т.д.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
exit:   Выход
clear:  Очистка экрана
current:d:\install\python3\projects\scripts
>>d:\1
ROOT: d:\1
   0:1.txt:link -> D:\1\2\3\4\5\6\7\8\1.txt
   1:2:dir
   2:2.txt:link -> d:\1\1.txt -> D:\1\2\3\4\5\6\7\8\1.txt
exit:   Выход
clear:  Очистка экрана
current:d:\1
>>2
Выбран файл: D:\1\2\3\4\5\6\7\8\1.txt
Вот так это выглядит с подсветкой, блекджеком и т.д.


P.S. Функция type_entry была изменена на более правильную и простую:
Python
1
2
3
4
5
6
7
8
9
def type_entry(entry):
    '''определяем тип записи'''
    types = {
        entry.is_dir():'dir',
        entry.is_file():'file',
        entry.is_symlink():'link'
    }
    
    return types.get(True)
1
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
28.08.2018, 14:58  [ТС]
Наконец таки вернулся из командировки :-)
Цитата Сообщение от blackeangel Посмотреть сообщение
Но она почему то не возвращает выбранный файл.
она оказывается возвращает, но ровно одну глубину. То есть если выбрать файл в рутой директории то возвращает, если уйти на глубину 2-3 каталога, то возвращает ровно столько раз сколько было вхождений(2-3 раза). То есть затирая ту возвратную.

Garry Galler, не сочтите за грубость, но что то вы наворотили уж что-то сложное:
регистр не распознает
цвета нет
ввод просто ужасный
море кода

Но зато комментарии полезные и есть несколько идей для исправлений у меня.

То есть у меня вся проблема оказалась в том, что не выходит сразу, а выходит в предыдущий заход.
Как сделать выход из всех заходов в функцию?
return возвращает в предыдущую тем самым затирая переменную, а надо сразу на выход - в главную.
exit тоже не то

Добавлено через 39 минут
Погуглив, решил эту проблему глобальной переменной. В итоге всё получилось вот так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# -*- coding: utf-8 -*-
import os, sys
 
selectfile=''
 
 
def clear():
    import subprocess as sp
    if os.name == ('ce', 'nt', 'dos'):
        sp.call('cls', shell=True)
        os.system('cls')
    elif os.name == 'posix':
        sp.call('clear', shell=True)
        os.system('clear')
    else:
        print('\n' * 120)
 
 
def filedirlist(startdir):
    global selectfile
    if selectfile != '':
        exit
    dirlist = []
    otherlist = []
    clear()
    for i in sorted(os.listdir(startdir)):
        if os.path.isdir(startdir + os.sep + i):
            dirlist.append((startdir + os.sep + i).replace(os.sep + os.sep, os.sep))
        else:
            otherlist.append((startdir + os.sep + i).replace(os.sep + os.sep, os.sep))
    otherlist.sort()
    dirlist.sort()
    dirlist.extend(otherlist)
    print('Current dir: ' + os.path.dirname(dirlist[0]))
    print('b: back')
    k = 0
    for k in range(len(dirlist)):
        try:
            lk = os.readlink(dirlist[k])
            if os.path.isdir(lk):
                print('\033[96m' + ' ' + str(k) + ': ' + dirlist[k].split(os.sep)[-1:][0] + '\033[00m' + ' -> ' + '\033[93m' + lk + '\033[00m')
            else:
                if os.path.islink(lk):
                    print('\033[96m' + ' ' + str(k) + ': ' + dirlist[k].split(os.sep)[-1:][0] + '\033[00m' + ' -> ' + '\033[96m' + lk + '\033[00m')
                else:
                    print('\033[96m' + ' ' + str(k) + ': ' + dirlist[k].split(os.sep)[-1:][0] + '\033[00m' + ' -> ' + lk)
            lk = ''
        except:
            if os.path.isdir(dirlist[k]):
                print('\033[93m' + ' ' + str(k) + ': ' + dirlist[k].split(os.sep)[-1:][0] + '/' + '\033[00m')
            else:
                print(' ' + str(k) + ': ' + dirlist[k].split(os.sep)[-1:][0])
    print('e: exit')
    b = input()
    if b.isdigit() == False:
        if b == 'e':
            clear()
            exit
        elif b == 'b':
            clear()
            filedirlist(os.path.dirname(os.path.dirname(dirlist[0])))
    else:
        try:
            if os.readlink(dirlist[int(b)]).isdir():
                filedirlist(os.readlink(dirlist[int(b)]))
            else:
                selectfile = str(os.readlink(dirlist[int(b)]))
        except:
            if os.path.isdir(dirlist[int(b)]):
                filedirlist(dirlist[int(b)])
            else:
                selectfile = str(dirlist[int(b)])
                print('')
    return selectfile
 
lmn = filedirlist('C:\\')
print(lmn)
Добавлено через 1 минуту
Garry Galler, clear не чистит ни у вас ни у меня. Пробовал море вариантов.
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
28.08.2018, 15:24
1) регистр не распознает. Оно мне надо было на windows?
2) цвета нет. Есть
3) ввод просто ужасный. Нормальный. И имеет больше возможностей: можно вводить как порядковые номера, так и имена.
4) море кода. Правильно написанного кода, а не как у вас - абсолютно нечитабельного и без всякой логики.
Но поскольку учиться вы не хотите - советовать правки бесполезно.
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
28.08.2018, 15:38  [ТС]
Garry Galler, ну видимо я тюлень или морской котик
Ошибки
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
C:\Python34\python.exe C:/Users/Sam/PycharmProjects/untitled4/file_manager.py
 
:exit, :e       Выход 
:clear,:c       Очистка экрана 
current_path    c:\ 
#>>:C:\\BatchApkTool
ROOT: c:\\batchapktool
Traceback (most recent call last):
  File "C:/Users/Sam/PycharmProjects/untitled4/file_manager.py", line 208, in <module>
    err, sfile = get_selected_file()
  File "C:/Users/Sam/PycharmProjects/untitled4/file_manager.py", line 196, in get_selected_file
    partial(after_input,inp.lower())
  File "C:/Users/Sam/PycharmProjects/untitled4/file_manager.py", line 169, in after_input
    enum_dir(inp)
  File "C:/Users/Sam/PycharmProjects/untitled4/file_manager.py", line 123, in enum_dir
    entries = os.scandir(inp)
AttributeError: 'module' object has no attribute 'scandir'
 
Process finished with exit code 1
 
'''===============''''
C:\Python34\python.exe "C:\Program Files\JetBrains\PyCharm 2017.2.3\helpers\pydev\pydevd.py" --multiproc --qt-support=auto --client 127.0.0.1 --port 60288 --file C:/Users/Sam/PycharmProjects/untitled4/file_manager.py
pydev debugger: process 8824 is connecting
 
Connected to pydev debugger (build 172.3968.37)
 
:exit, :e       Выход 
:clear,:c       Очистка экрана 
current_path    c:\users\sam\pycharmprojects\untitled4 
#>>:C:\BatchApkTool
Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm 2017.2.3\helpers\pydev\pydevd.py", line 1599, in <module>
ROOT: c:\batchapktool
    globals = debugger.run(setup['file'], None, None, is_module)
  File "C:\Program Files\JetBrains\PyCharm 2017.2.3\helpers\pydev\pydevd.py", line 1026, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm 2017.2.3\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/Sam/PycharmProjects/untitled4/file_manager.py", line 211, in <module>
    err, sfile = get_selected_file()
  File "C:/Users/Sam/PycharmProjects/untitled4/file_manager.py", line 198, in get_selected_file
    partial(after_input, inp.lower())
  File "C:/Users/Sam/PycharmProjects/untitled4/file_manager.py", line 171, in after_input
    enum_dir(inp)
  File "C:/Users/Sam/PycharmProjects/untitled4/file_manager.py", line 125, in enum_dir
    entries = os.scandir(inp)
AttributeError: 'module' object has no attribute 'scandir'
 
Process finished with exit code 1
ну и фотка
Миниатюры
Функция не возвращает ничего  
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
28.08.2018, 20:18
1) os.scandir(path='.') New in version 3.5.
(Python 3.4? Я такого не знаю - начинал сразу с 3.5, а использую 3.8. Вы отстали от прогресса лет на пять.)
2) Кросплатформенная подсветка в терминале это colorama.
Естественно, нужно устанавливать. У меня в коде стоит проверка - есть такой модуль - используем, нет - не используем.
3) Регистронезависимость правится удалением приведения строк к нижнему регистру (.lower() или созданием обертки вокруг нее для не "nt" ОС)
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
28.08.2018, 22:27  [ТС]
Garry Galler,

Не по теме:

оффициально 3.7.0 только...

0
28.08.2018, 22:45

Не по теме:

Цитата Сообщение от blackeangel Посмотреть сообщение
оффициально 3.7.0 только...
И? На гитхабе всегда лежит свежая development сборка (сейчас как раз 3.8.0 alpha 0) - загружай, компилируй и пользуйся.

0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
28.08.2018, 22:48  [ТС]
Garry Galler,

Не по теме:

а вот со сборкой у меня как раз проблемы. Не собирается статический. Может поможете в этом направлении в другой теме?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.08.2018, 22:48

Функция ничего не выводит
Функция Median должна выводить значения, но вместо этого Process finished with exit code 0. Помогите понять, что не так? def main(): ...

Почему функция ничего не возвращает?
В общем пишу временный кастыль, который поможет преобразовать название страницы в нужный мне вид для определенных страниц. Функция -...

Процедуры и функции: Почему функция ничего не возвращает?
Есть функция, высчитавающая факториал из числа. Число вводится с клавиатуры, затем результат выводится на экран. Вопрос собственно в том,...

Как выглядит функция, которая ничего не принимает и возвращает тип int?
У меня возник следующий вопрос при изучении функции: как выглядит функция, которая ничего не принимает и возвращает тип int?

Передача динамического массива из функции в функции / Функция ничего не возвращает
Здравствуйте! Хочу узнать, правильно ли я передал динамический массив в другую функцию, и почему функция ArithmeticMean ничего не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru