Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有提示和默认隐藏的Python单击选项_Python_Python Click - Fatal编程技术网

带有提示和默认隐藏的Python单击选项

带有提示和默认隐藏的Python单击选项,python,python-click,Python,Python Click,下面的代码段提示输入用户和密码,默认为env变量 现在,虽然在键入时密码输入被很好地隐藏,但我也希望括号之间的默认值也被隐藏,到目前为止,如果我输入这个,密码默认值为clear1234: ➜ export PASSWORD=1234 ➜ python test.py ➜ User [myuser]: you can see here ➜ Password [1234]: user you can see here password you cant see import os im

下面的代码段提示输入用户和密码,默认为env变量

现在,虽然在键入时密码输入被很好地隐藏,但我也希望括号之间的默认值也被隐藏,到目前为止,如果我输入这个,密码默认值为clear1234

➜  export PASSWORD=1234
➜  python test.py
➜  User [myuser]: you can see here
➜  Password [1234]: 
user you can see here
password you cant see


import os
import click

@click.command()
@click.option('--user', prompt=True, default=lambda: os.environ.get('USER', ''))
@click.option('--password', prompt=True, default=lambda: os.environ.get('PASSWORD', ''), hide_input=True)
def test(user, password):
    print('user {}'.format(user))
    print('password {}'.format(password))
    print(password)


if __name__ == '__main__':
    test()

找不到更好的解决方案,但也许这样就可以了。如果未提供输入,则可以使用检查输入值并将其替换为环境值

def callback(ctx, param, value):
  if not value:
    return os.environ.get('PASSWORD', '')
  return value
...
@click.option('--password', prompt=True, callback=callback, default='', hide_input=True)

您可以创建一个其字符串表示形式隐藏密码的类:

class HiddenPassword(object):
    def __init__(self, password=''):
        self.password = password
    def __str__(self):
        return '*' * len(self.password)
@click.command()
@click.option('--user',
              prompt=True,
              default=lambda: os.environ.get('USER', ''))
@click.option('--password',
              prompt=True,
              default=lambda: HiddenPassword(os.environ.get('PASSWORD', '')),
              hide_input=True)
def test(user, password):
    print('user: {}'.format(user))
    if isinstance(password, HiddenPassword):
        password = password.password
    print('password: {}'.format(password))
然后在代码中,您只需检查是否使用了该类并更新密码:

class HiddenPassword(object):
    def __init__(self, password=''):
        self.password = password
    def __str__(self):
        return '*' * len(self.password)
@click.command()
@click.option('--user',
              prompt=True,
              default=lambda: os.environ.get('USER', ''))
@click.option('--password',
              prompt=True,
              default=lambda: HiddenPassword(os.environ.get('PASSWORD', '')),
              hide_input=True)
def test(user, password):
    print('user: {}'.format(user))
    if isinstance(password, HiddenPassword):
        password = password.password
    print('password: {}'.format(password))
在行动中:

$ PASSWORD=foobar python test.py
User [mVChr]:
Password [******]:
user: mVChr
password: foobar
$ PASSWORD=foobar python test.py
User [mVChr]: dan
Password [******]:
user: dan
password: user-entered-pw

我更喜欢@mVChr的解决方案,回调效果很好,我只是更喜欢显示星号,建议用户已经输入了一些内容。没问题,我也喜欢他的解决方案:)我也喜欢你的解决方案。:)我一直都喜欢不太定制的代码。这很好,我只是改成了
return'*'*4
,这样就不会有任何信息了好主意,我太可爱了。您甚至可以让它
返回'env$PASSWORD'
或其他内容。