Search code examples
pythonsimpy

'builtin_function_or_method' object has no attribute 'randrange'


i am having a weird issue,

i have created the following code to randomly generate numbers between 1 and x with increments of 1 and to store them

import random

bootstrap_node_list_recieved = [] #List of all nodes addresses recieved during the bootstrap peroid - Is a list so we can compare duplicatition probability etc
average_getAdrr_no_node_response = 100 #Number or nodes typically sent when a node requests a getAddr message
network_ip_node_size = 5000 # Number of IP addresses / nodes that have been seen on the network in the past 2 weeks


#Move into calculations.py when ready
#Number of nodes recieved (Bootstrap)
def bootstrap_node_getAddr():
    #### TODO ####
    #Random generation of nodes (number represents a single node), from 1 to x for an average amount of nodes
    # node_list=[random.randrange(1,network_ip_node_size,1) for _ in range (average_getAdrr_no_node_response)]
    for i in range (average_getAdrr_no_node_response):
        bootstrap_node_list_recieved.append(random.randrange(1,network_ip_node_size,1))
    print 'bootstrap_node_getAddr: ', bootstrap_node_list_recieved
    # return bootstrap_node_list_recieved

bootstrap_node_getAddr()

this code is working fine on its own, however when i insert it into my main code base i get the error

Traceback (most recent call last):
  File "BootstrapBTC.py", line 117, in query_dns_servers
    bootstrap_node_getAddr()
  File "/home/richard/Dropbox/PhD/Simulator BTC - Ours/Calculations.py", line 33, in bootstrap_node_getAddr
    bootstrap_node_list_recieved.append(random.randrange(1,network_ip_node_size,1))
AttributeError: 'builtin_function_or_method' object has no attribute 'randrange'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "BootstrapBTC.py", line 90, in run
    yield self.env.process(query_dns_servers(env, self))
AttributeError: 'builtin_function_or_method' object has no attribute 'randrange'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "BootstrapBTC.py", line 178, in <module>
    env.run()
  File "/usr/local/lib/python2.7/dist-packages/simpy/core.py", line 137, in run
    self.step()
  File "/usr/local/lib/python2.7/dist-packages/simpy/core.py", line 229, in step
    raise exc
AttributeError: 'builtin_function_or_method' object has no attribute 'randrange

the code on line 90 is

    yield self.env.process(query_dns_servers(env, self))

which just calls

#Average respsonse time from a DNS server
def DnsServerResponse(env, self):
    yield self.env.timeout(dns_average_response)

which appends a random value into the simulation time, i do not think it has anything to do with this line of code since it doesn't use the random library at all, infact the code inserted is the only thing so far which uses the library

anyone got any ideas what the issue is ? it is driving me mad !

Thanks !

tried changing my import to just import random, and now get :

Traceback (most recent call last):
  File "BootstrapBTC.py", line 102, in query_dns_servers
    DnsUp = DnsUpProbability()
  File "/home/richard/Dropbox/PhD/Simulator BTC - Ours/Calculations.py", line 39, in DnsUpProbability
    up = (0 if random() > Prob_DNS_UP else 1)
TypeError: 'module' object is not callable

Solution

  • The error is because you most likely assigned random to another value somewhere in your code overriding the original random of the random module.

    Try checking your code over to see what else you assigned random to. Or you can check it by doing so: before where you used random

    print(random, type(random))
    

    Another way to fix this is if your code is too long and hard to check over, you can import random like this: using import...as... format.

    import random as rand
    # and when using it, type rand instead of random
    bootstrap_node_list_recieved.append(rand.randrange(1,network_ip_node_size,1))
    

    You should also check to see if there's any file named random.py in your sys.path.