如何将所有调用的函数参数变成一个 (Python 3)
How to turn all called function arguments into one (Python 3)
我正在 Python 中构建一个终端模拟器,我将命令存储在参数中,例如:
def ls(a):
for item in os.listdir():
print item
a = input('Command: ')
a = a.split()
终端是这样工作的:
- 要求用户输入
- 拆分输入
- 使用输入的第一部分在本地搜索函数
- 如果有,则使用输入的其余部分作为参数
- 调用函数
我的 cd 命令有问题。
def cd(a):
if a == None:
print('cd')
print('Change directories')
else:
os.chdir(os.getcwd() + '/' + a())
当你让它进入一个没有空格的文件夹时它会起作用,比如当你在提示符中键入 cd Windows
时它会起作用。但是,当您尝试输入其中包含空格的文件夹时,问题就开始了。例如,当我键入 cd Documents Copy
时,它要么进入文件夹 Documents(如果有),要么崩溃。
我该如何解决?我想过将所有调用的函数参数变成一个,但我不知道该怎么做,可能还有其他方法。
您需要更复杂的 split()
函数 -- 请参阅 Split a string by spaces — preserving quoted substrings answer 以了解可能的解决方案。
更新
如果你有一个名为 "the dog" 的子目录,里面有一个 space,在你的解释器中你可以这样做:
Command: cd "the dog"
代码修改大致如下:
import shlex
import os
def ls(a):
for item in os.listdir():
print(item)
def cd(a):
if a == None:
print('cd')
print('Change directories')
else:
os.chdir(os.getcwd() + '/' + a)
a = input('Command: ')
a = shlex.split(a)
if len(a) > 1:
locals()[a[0]](a[1][:99])
print()
else:
locals()[a[0]](None)
print()
我正在 Python 中构建一个终端模拟器,我将命令存储在参数中,例如:
def ls(a):
for item in os.listdir():
print item
a = input('Command: ')
a = a.split()
终端是这样工作的:
- 要求用户输入
- 拆分输入
- 使用输入的第一部分在本地搜索函数
- 如果有,则使用输入的其余部分作为参数
- 调用函数
我的 cd 命令有问题。
def cd(a):
if a == None:
print('cd')
print('Change directories')
else:
os.chdir(os.getcwd() + '/' + a())
当你让它进入一个没有空格的文件夹时它会起作用,比如当你在提示符中键入 cd Windows
时它会起作用。但是,当您尝试输入其中包含空格的文件夹时,问题就开始了。例如,当我键入 cd Documents Copy
时,它要么进入文件夹 Documents(如果有),要么崩溃。
我该如何解决?我想过将所有调用的函数参数变成一个,但我不知道该怎么做,可能还有其他方法。
您需要更复杂的 split()
函数 -- 请参阅 Split a string by spaces — preserving quoted substrings answer 以了解可能的解决方案。
更新
如果你有一个名为 "the dog" 的子目录,里面有一个 space,在你的解释器中你可以这样做:
Command: cd "the dog"
代码修改大致如下:
import shlex
import os
def ls(a):
for item in os.listdir():
print(item)
def cd(a):
if a == None:
print('cd')
print('Change directories')
else:
os.chdir(os.getcwd() + '/' + a)
a = input('Command: ')
a = shlex.split(a)
if len(a) > 1:
locals()[a[0]](a[1][:99])
print()
else:
locals()[a[0]](None)
print()