Default/editable string to raw_input

P

Paraic Gallagher

Hi,

This is my first post to the list, I hope somebody can help me with this
problem. Apologies if it has been posted before but I have been internet
searching to no avail.

What I am trying to do is provide a simple method for a user to change a
config file, for a test suite.
The config file consists of a number of keys, eg. build number, target
device, etc.

What I would like to do is give the user a key, and the previous value
for that key.
The user can then accept the previous value or edit it on the line.

I have a method where the previous value of a key is presented to the
user and can be accepted if the user hits return. But as some of the
values are somewhat long, and the user may only need to change 1 or 2
characters, it would be a nice feature to offer line editing.

I can get the readline.set_pre_input_hook() function to send text after
a raw_input prompt, but this text cannot be edited.

Thanks in advance for any help.
Paraic.
 
S

Sybren Stuvel

Paraic Gallagher enlightened us with:
What I am trying to do is provide a simple method for a user to
change a config file, for a test suite.

My opinion: let the user edit the configuration file using his/her
favourite text editor. Someone configuring a test suite should
certainly be able to edit a text file.

Sybren
 
P

Paraic Gallagher

Sybren said:
My opinion: let the user edit the configuration file using his/her
favourite text editor. Someone configuring a test suite should
certainly be able to edit a text file.

Sybren
While I agree in principal to your opinion, the idea is that an absolute
moron
would be able to configure a testcell with smallest amount of effort
possible.

Moreover, I am curious as to whether somebody else out there knows if
there is a solution to the problem.

Paraic.
 
S

Sybren Stuvel

Paraic Gallagher enlightened us with:
While I agree in principal to your opinion, the idea is that an
absolute moron would be able to configure a testcell with smallest
amount of effort possible.

Then explain to me why learning how to use your program to edit the
file is easier than using an already familiar program.
Moreover, I am curious as to whether somebody else out there knows
if there is a solution to the problem.

Give a default answer that's chosen when the user presses enter
without providing an answer of his own.

Sybren
 
D

David Wahler

Paraic said:
Hi,

This is my first post to the list, I hope somebody can help me with this
problem. Apologies if it has been posted before but I have been internet
searching to no avail.

What I am trying to do is provide a simple method for a user to change a
config file, for a test suite.
The config file consists of a number of keys, eg. build number, target
device, etc.

What I would like to do is give the user a key, and the previous value
for that key.
The user can then accept the previous value or edit it on the line.

I have a method where the previous value of a key is presented to the
user and can be accepted if the user hits return. But as some of the
values are somewhat long, and the user may only need to change 1 or 2
characters, it would be a nice feature to offer line editing.

I can get the readline.set_pre_input_hook() function to send text after
a raw_input prompt, but this text cannot be edited.

With the disclaimer that, as others have said, this may not be the best
user-interface choice:

import readline
readline.set_startup_hook(lambda: readline.insert_text(old_value))
try:
new_value = raw_input()
finally:
readline.set_startup_hook(None)

Note that, among other issues, this isn't threadsafe (but then, you
really shouldn't be doing console I/O from multiple threads anyway).
Hope this helps.

-- David
 
P

Paraic Gallagher

David said:
With the disclaimer that, as others have said, this may not be the best
user-interface choice:

import readline
readline.set_startup_hook(lambda: readline.insert_text(old_value))
try:
new_value = raw_input()
finally:
readline.set_startup_hook(None)

Note that, among other issues, this isn't threadsafe (but then, you
really shouldn't be doing console I/O from multiple threads anyway).
Hope this helps.

-- David
Thanks David, this was exactly what I was looking for.

Paraic.
 
S

Sion Arrowsmith

Sybren Stuvel said:
Paraic Gallagher enlightened us with:
Then explain to me why learning how to use your program to edit the
file is easier than using an already familiar program.

You're assuming that the tester is already familiar with a text
editor. And then they would have to learn the syntax of the
configuration file, and the parameters available. A point-and-
drool interface requires no such learning.
 
S

Sybren Stuvel

Sion Arrowsmith enlightened us with:
You're assuming that the tester is already familiar with a text
editor.

Indeed. Someone working on a test suite sounded like someone who knows
how to work with a text editor.
And then they would have to learn the syntax of the configuration
file, and the parameters available.

True. Thorough comments and a clear syntax help a long way.
A point-and-drool interface requires no such learning.

But that's not what you get with raw_input().

Sybren
 
O

Ognjen Bezanov

Hi all, I am trying to convert a hexdecimal value to a char using this code:

print ' %c ' % int(0x62)

this works fine, but if I want to do this:

number = "62"
print ' %c ' % int("0x" + number)

I get an error:

Traceback (most recent call last):
File "<stdin>",line 1, in ?
ValueError: invalid literal for in(): 0x62

How can I convert a string "0x62" to int/hex without this problem?

Thanks!
 
S

Sybren Stuvel

Ognjen Bezanov enlightened us with:
Hi all, I am trying to convert a hexdecimal value to a char using this code:

print ' %c ' % int(0x62)
This is an integer ^^^^

this works fine, but if I want to do this:

number = "62"
print ' %c ' % int("0x" + number)
This is a string ^^^^^^^^^^^^^
How can I convert a string "0x62" to int/hex without this problem?

In [0]: exec('num=0x%s' % '62')

In [1]: num
Out[1]: 98


Sybren
 
T

Tim Chase

How can I convert a string "0x62" to int/hex without this problem?

The call to int() takes an optional parameter for the base:
int(x[, base]) -> integer

Convert a string or number to an integer, if possible. A
floating point argument will be truncated towards zero (this
does not include a string representation of a floating point
number!) When converting a string, use the optional base.
It is an error to supply a base when converting a
non-string. If the argument is outside the integer range a
long object will be returned instead.
98

-tkc
 
O

Ognjen Bezanov

Hi all, Another problem, with the same error (error: "invalid literal for
int()")

code:

mynums = "423.523.674.324.342.122.943.421.762.158.830"

mynumArray = string.split(mynums,".")

x = 0
for nums in mynumArray:
if nums.isalnum() == true:
x = x + int(nums)
else:
print "Error, element contains some non-numeric characters"
break


/end code

This seemed like a simple thing, and I have done it before with no issues.
have I missed something obvious? taking into account my previous hex
question, I tried changing int(nums) to int(nums,10) but it still gives me
the error
 
H

Heiko Wundram

Am Sonntag 14 Mai 2006 22:23 schrieb Ognjen Bezanov:
mynums = "423.523.674.324.342.122.943.421.762.158.830"

mynumArray = string.split(mynums,".")

This is the old way of using string functions using the module string. You
should only write this as:

mynumArray = mynums.split(".")

(using the string methods of string objects directly)
x = 0
for nums in mynumArray:

This is misleading. Rename the variable to num, as it only contains a single
number.
if nums.isalnum() == true:

..isalnum() checks whether the string consists of _alpha_-numeric characters
only. So, in this case, it may contain letters, among digits. .isdigit()
checks whether it is a (base <= 10) number.
x = x + int(nums)
else:
print "Error, element contains some non-numeric characters"

As you don't know what the offending element is, insert a:

print nums

here.

If you change the code as noted above, it works fine for me.

--- Heiko.
 
D

Dennis Lee Bieber

Hi all, I am trying to convert a hexdecimal value to a char using this code:

print ' %c ' % int(0x62)
This usage of int() is a no-op... The Python interpreter correctly
handles 0x literals as hexidecimal representation of integer value.
You also don't need to use the string interpolation...
How can I convert a string "0x62" to int/hex without this problem?
Step one, forget about the 0x preface...

int()

will convert a string to a numeric IF the only characters in the string
are applicable to the radix (default 10). The "x" you supplied is not a
valid character for a base-10 literal (and also not for a base-16
literal). Just supply the two-digit hex representation, and specify a
radix of 16.
--
Wulfraed Dennis Lee Bieber KD6MOG
(e-mail address removed) (e-mail address removed)
HTTP://wlfraed.home.netcom.com/
(Bestiaria Support Staff: (e-mail address removed))
HTTP://www.bestiaria.com/
 
T

Tim Chase

Hi all, Another problem, with the same error (error: "invalid literal for

Having the actual code would be helpful...
code:

mynums = "423.523.674.324.342.122.943.421.762.158.830"

mynumArray = string.split(mynums,".")

x = 0
for nums in mynumArray:
if nums.isalnum() == true:

This line would likely bomb, as in python, it's "True", not
"true" (unless you've defined lowercase versions elsewhere)
x = x + int(nums)
else:
print "Error, element contains some non-numeric characters"
break

However, I modified your code just a spot, and it worked
like a charm:

mynums = "423.523.674.324.342.122.943.421.762.158.830"
mynumArray = mynums.split(".")
x = 0
for num in mynumArray:
if num.isdigit():
x = x + int(num)
else:
print "Error"
break

and it worked fine.

A more pythonic way may might be

x = sum([int(q) for q in mynumArray if q.isdigit()])

or, if you don't need mynumArray for anything, you can just use

x = sum([int(q) for q in mynum.split(".") if q.isdigit()])

Hope this gives you some stuff to work with,

-tkc
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,780
Messages
2,569,611
Members
45,280
Latest member
BGBBrock56

Latest Threads

Top